在Ruby中解析表的最佳方法

时间:2009-08-04 23:21:32

标签: ruby parsing

我想将一个简单的表解析为Ruby数据结构。该表如下所示:

alt text http://img232.imageshack.us/img232/446/picture5cls.png http://img232.imageshack.us/img232/446/picture5cls.png

修改: Here is the HTML

我想把它解析成一个哈希数组。 。E.g,:

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

有关如何做到这一点的任何想法? Perl有HTML::TableExtract,我认为它可以完成这项工作,但我找不到任何类似的Ruby库。

2 个答案:

答案 0 :(得分:5)

您可能想尝试Hpricotgem install hpricot,为* nix系统添加常用的sudo

我将您的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>部分within the table中,则更有意义。但当然,它可能不是“您的”HTML!)

答案 1 :(得分:2)

如果没有为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"

显然,这段代码远非完美,但它应该让你开始。