Экспорт всего html <table>в текстовый документ с использованием Watir - PullRequest
2 голосов
/ 02 декабря 2011

По сути, все, что я хотел бы сделать, это экспортировать всю HTML-таблицу в файл .txt (документ блокнота).

До сих пор я узнал, как настроить браузер для поиска html-страницы с таблицей.

require 'rubygems' 
require 'hpricot' 
require "watir-webdriver" 
url = "http://www.example.com"
browser = Watir::Browser.new 
browser.goto url

После запуска вышеупомянутого в cmd я теперь вижу HTML-таблицу в браузере.

Вот где я застрял. Как мне использовать Watir для

  1. Найди тэг
  2. собрать все (т. Е. HTML и текст), который находится внутри и.
  3. Извлеките эти результаты в текстовый файл (документ блокнота) и сохраните его в определенной папке.

К вашему сведению, HTML-таблица выглядит следующим образом ...

<table border="1" cellpadding="2">
<tr>
<th> Address </th>
<th> Council tax band </th>
<th> Annual council tax </th>
</tr>

<tr>
<td> 2, STONELEIGH AVENUE, COVENTRY, CV5 6BZ </td>
<td align="center"> F </td>
<td align="center"> &pound;2125 </td>
</tr>

....... Вышеупомянутая строка повторяется много раз ......

</table> 

Затем стол закрывается.

Итак, чтобы перефразировать мою ситуацию. Я могу использовать Watir для перехода браузера на страницу, содержащую таблицу html, но моя проблема в том, что я не уверен, как извлечь результаты (все в теге - включая html) в файл .txt, а затем сохранить этот файл .txt файл на мой компьютер.

Я бы предпочел сделать небольшие шаги с использованием Watir. Я знаю это, поэтому я просто хотел бы узнать, как извлечь таблицу и сохранить все, что я извлек в файл .txt. Я видел несколько примеров онлайн с использованием hpricot. Однако, как представляется, в большинстве примеров отсутствует код, подробно описывающий, как массив (если это правильный подход) выводится в файл .txt.

Не могли бы вы помочь, продемонстрировав, как написать простой фрагмент кода, который будет извлекать HTML-таблицу (и все, включая, и все, что между ними) в файл блокнота .txt?

Большое спасибо за ваше время.

Ответы [ 2 ]

4 голосов
/ 02 декабря 2011

Чтобы получить HTML всей таблицы (если это единственная таблица на странице):

browser.table.html

Вы получите что-то вроде этого:

=> "<table border=\"1\" cellpadding=\"2\">\n<tbody><tr>\n<th> Address </th>\n<th> Council tax band </th>\n<th> Annual council tax </th>\n</tr>\n\n<tr>\n<td> 2, STONELEIGH AVENUE, COVENTRY, CV5 6BZ </td>\n<td align=\"center\"> F </td>\n<td align=\"center\"> £2125 </td>\n</tr>\n\n</tbody></table>"

Чтобы получить HTML каждой строки и поместить ее в массив:

browser.table.trs.collect {|tr| tr.html}

=> ["<tr>\n<th> Address </th>\n<th> Council tax band </th>\n<th> Annual council tax </th>\n</tr>",
    "<tr>\n<td> 2, STONELEIGH AVENUE, COVENTRY, CV5 6BZ </td>\n<td align=\"center\"> F </td>\n<td align=\"center\"> £2125 </td>\n</tr>"] 

Чтобы получить текст каждой ячейки и поместить его в массив:

browser.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
=> [["Address", "Council tax band", "Annual council tax"],
    ["2, STONELEIGH AVENUE, COVENTRY, CV5 6BZ", "F", "£2125"]] 

Для записи текста каждой ячейки в файл:

content = b.table.trs.collect {|tr| [tr[0].text, tr[1].text, tr[2].text]}
File.open("table.txt", "w") {|file| file.puts content}

Файл будет выглядеть так:

Address
Council tax band
Annual council tax
2, STONELEIGH AVENUE, COVENTRY, CV5 6BZ
F
£2125
2 голосов
/ 02 декабря 2011

Есть много способов приблизиться к этому, если мы узнаем немного больше о том, что вы конкретно пытаетесь выполнить, то мы можем дать вам ответы, которые также немного более конкретны, чем общие.

Вы можете использовать .collect, как показал Zeljko, если вы хотите конвертировать вещи в массивы. Если вы просто хотите работать с данными или перебирать строки и ячейки в таблице, тогда .each или .each_with_index может быть тем, что вам нужно.

Я подозреваю, что вы действительно хотите текст из таблицы, а не HTML. Так что вот что попробовать (не проверено, но это должно работать)

browser.table(:how => what).rows.each_with_index do |row, r|
  row.cells.each_with_index do |cell, c|
    puts "Row:#{r} Cell:#{c} text is: #{cell.text}"
  end
end

, если .rows или .cells не работает (неизвестный метод) в приведенном выше, попробуйте заменить на .trs и .tds соответственно (не все версии watir имеют дружественные псевдонимы для этих методов)

Посмотрите, выплевывает ли это то, что вас интересует. Если это так, вы сможете легко изменить запись в файл, а не выводить его на экран.

Однако, если ваша цель - проверка, тогда может быть проще, чтобы код автоматизации посмотрел в БД и провел сравнение за вас.

...