Как сохранить определенные значения атрибутов HTML в CSV-файл?

0

это мой первый пост здесь, так что будьте осторожны. :)

Мой сценарий должен открыть страницу форума, заполнить поля входа/выхода, отправить форму и сохранить определенные данные с недавно открытой страницы (список пользователей, электронные письма и т.д.). Как только я отправлю форму, мне нужно подождать около 5 -10s, поэтому мой тайм-аут довольно большой. Я очень благодарен Виджаю, потому что я начал с ответа на этот пост: Как отправить форму с помощью PhantomJS

Только для целей тестирования содержимое веб-сайта console.log два раза: один раз перед входом в систему и один раз после. Он также работает.

Содержимое HTML списка пользователей состоит из множества элементов. Один из них выглядит (обрезает все стили, классы и т.д.):

<tr>
  <td class="gen" align="center">
    <a href="mailto:[email protected]">[code for img]</a>
  </td>
  <td class="gen" align="center">
    <a href="www.website.com">[code for img]</a>
  </td>
  //many tds
</tr>

TD и TR не имеют идентификатора или имени. Есть несколько столбцов, но я хочу сохранить только csv (если это невозможно из-за отсутствия идентификаторов полей, я могу сохранить все в csv, но это менее желательное решение). Я хотел бы как-то идентифицировать нужные данные, ища "mailto", а затем сохранить только "[email protected]" в файл.

Я не знаю, как не только сохранить его в csv, но и позволить скрипту узнать, какие данные должны получить в ячейку в электронной таблице.

Код:

var page = require('webpage').create();
var fs = require('fs');
var testindex = 0, loadInProgress = false;

page.onConsoleMessage = function(msg) {
  console.log(msg);
};
page.onLoadStarted = function() {
  loadInProgress = true;
  console.log("load started");
};
page.onLoadFinished = function() {
  loadInProgress = false;
  console.log("load finished");
};

var steps = [
  function() {
    //Load Login Page
   page.open("http://www.website.com/memberlist.php");
  },
  function() {
    //Enter Credentials
    page.includeJs("http://ajax.googleapis.com/ajax/libs/jquery/1.6.1/jquery.min.js",   function() {
        page.evaluate(function() {
            $("input[name='username']").val("login");   
            $("input[name='password']").val("password");
            $("input[value='Log in']").click();
            console.log("form filled in"); //works
        });

    var markup = page.content;
    console.log(markup);
    page.render("form filled.png"); //works
});
  }, 
  function() {
    // Output content of page to stdout after form has been submitted
    page.evaluate(function() {
    var record = document.querySelectorAll("tr.row1");   //input.row1, input.row2
    //console.log(inputs.length);
    for (i=0; i < record.length; i++){
    console.log(document.querySelectorAll('tr.row1')[i].outerHTML);
} 
});
  }
];

interval = setInterval(function() {
  if (!loadInProgress && typeof steps[testindex] == "function") {
    console.log("step " + (testindex + 1));
    steps[testindex]();
    testindex++;
  }
  if (typeof steps[testindex] != "function") {
    console.log("test complete!");
    page.render('export.png'); //works. it a screenshoot in a newly opened webpage   already after succesful log in.
    phantom.exit();
  }
}, 10000);
Теги:
csv
phantomjs

1 ответ

0
Лучший ответ

Вы можете создать строку, представляющую содержимое файла csv, а затем использовать URI данных (для этого вопроса SO), чтобы он мог быть загружен.

Чтобы получить представление csv таблицы:

function tableToCSV(tabID) {
   var csvLines = [];
   var tabEl = document.getElementById('tabID');
   var rows = tabEl.getElementsByTagName('tr');
   for(var row = 0; row < rows.length; ++row) {
      var cells = rows[row].getElementsByTagName('td');
      var rowValues = [];
      for(var cell = 0; cell < cells.length; ++cell) {
         var cellText = cells[cell].innerText;
         // could escape commas here
         rowValues.push(cellText);
      }
      csvLines.push(rowValues.join(','));
   }
   return csvLines.join("\n");
}

Ещё вопросы

Сообщество Overcoder
Наверх
Меню