用Ruby解析表格的最佳方法

3
我想将一个简单的表格解析成Ruby数据结构。这个表格看起来像这样:

alt text 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库。


也许可以发布你想解析的实际HTML代码吗? - Michael Sofaer
图片和HTML链接已经无效,使问题变得不太清晰了。 - Brian Tompsett - 汤莱恩
https://dev59.com/C3I95IYBdhLWcg3w_zQN - peter
2个回答

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 稍微有点格式问题:你在 <tbody> 中使用了 <th> 标签,这似乎有点不合理:如果它只是在 <table> 中的另一个层级,那么 <tbody> 就没有什么意义了。如果你的 <tr><th>...</th></tr> 内容在表格中单独放在一个 <thead> 部分中,则更加合理 但这可能并不是“你”的HTML,当然!


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"

这段代码显然远非完美,但它应该能让你入门。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接