Лучший способ разобрать таблицу в Ruby - PullRequest
3 голосов
/ 05 августа 2009

Я бы хотел разобрать простую таблицу в структуру данных Ruby. Таблица выглядит так:

альтернативный текст http://img232.imageshack.us/img232/446/picture5cls.png http://img232.imageshack.us/img232/446/picture5cls.png

Редактировать: Вот HTML

и я бы хотел разобрать его в массив хэшей. Например,:.

schedule[0]['NEW HAVEN'] == '4:12AM'
schedule[0]['Travel Time In Minutes'] == '95'

Есть мысли о том, как это сделать? Perl имеет HTML :: TableExtract , который, я думаю, сработает, но я не могу найти подобную библиотеку для Ruby.

Ответы [ 2 ]

5 голосов
/ 05 августа 2009

Возможно, вы захотите попробовать Hpricot (gem install hpricot, добавьте обычный sudo для * nix систем)

Я поместил ваш HTML в input.html, затем запустил это:

require 'hpricot'

doc = Hpricot.XML(open('input.html'))

table = doc/:table

(table/:tr).each do |row|
  (row/:td).each do |cell|
    puts cell.inner_html
  end
end

, что в первом ряду дает мне

<span class="black">12:17AM </span>
<span class="black">
    <a href="http://www.mta.info/mnr/html/planning/schedules/ref.htm"></a></span>
<span class="black">1:22AM  </span>
<span class="black">
    <a href="http://www.mta.info/mnr/html/planning/schedules/ref.htm"></a></span>
<span class="black">65</span>
<span class="black">TRANSFER AT STAMFORD (AR 1:01AM & LV 1:05AM)                                                                            </span>
<span class="black">

 N


</span>

Итак, мы уже подошли к содержанию тегов TD. Немного больше работы, и ты здесь.

(Кстати, HTML выглядит немного искаженным: у вас есть <th> теги в <tbody>, что кажется немного извращенным: <tbody> довольно бессмысленно, если это просто будет другой уровень в пределах <table>. имеет гораздо больше смысла, если ваш <tr><th>...</th></tr> материал находится в отдельном <thead> разделе в таблице . Но, конечно, это может быть не "ваш" HTML!)

2 голосов
/ 05 августа 2009

В случае, если для ruby ​​нет библиотеки, вот код, который поможет вам начать писать самостоятельно:

require 'nokogiri'
doc=Nokogiri("<table><tr><th>la</th><th><b>lu</b></th></tr><tr><td>lala</td><td>lulu</td></tr><tr><td><b>lila</b></td><td>lolu</td></tr></table>")
header, *rest = (doc/"tr").map do |row|
  row.children.map do |c|
    c.text
  end
end
header.map! do |str| str.to_sym end
item_struct = Struct.new(*header)
table = rest.map do |row|
  item_struct.new(*row)
end
table[1].lu #=> "lolu"

Этот код, очевидно, далек от совершенства, но он должен помочь вам начать работу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...