如何使用 Nokogiri 解析 HTML 表格?
Posted
技术标签:
【中文标题】如何使用 Nokogiri 解析 HTML 表格?【英文标题】:How do I parse an HTML table with Nokogiri? 【发布时间】:2011-01-04 22:41:08 【问题描述】:我安装了 Ruby 和 Mechanize。在我看来,在 Nokogiri 可以做我想做的事,但我不知道该怎么做。
这个table
怎么样?它只是 vBulletin 论坛站点的 html 的一部分。我试图保留 HTML 结构,但删除了一些文本和标签属性。我想获取每个线程的一些详细信息,例如:标题、作者、日期、时间、回复和视图。
请注意,HTML 文档中的表格很少?我正在寻找一张带有tbody
、<tbody id="threadbits_forum_251">
的特殊桌子。名称将始终相同(我希望)。我可以在代码中使用tbody
和name
吗?
<table >
<tbody>
<tr> <!-- table header --> </tr>
</tbody>
<!-- show threads -->
<tbody id="threadbits_forum_251">
<tr>
<td></td>
<td></td>
<td>
<div>
<a href="showthread.php?t=230708" >Vb4 Gold Released</a>
</div>
<div>
<span><a>Paul M</a></span>
</div>
</td>
<td>
06 Jan 2010 <span class="time">23:35</span><br />
by <a href="member.php?find=lastposter&t=230708">shane943</a>
</div>
</td>
<td><a href="#">24</a></td>
<td>1,320</td>
</tr>
</tbody>
</table>
【问题讨论】:
实际上,属性可以让查找数据变得更容易,尤其是使用 xpath。 @Wayne 你能告诉我为什么属性可以使它更容易吗? 您经常会发现您想要的数据具有特定属性,这些属性恰好使您更容易构建 xpath 来挑选这些数据。例如,如果您想要的表格是“ 【参考方案1】:#!/usr/bin/ruby1.8
require 'nokogiri'
require 'pp'
html = <<-EOS
(The HTML from the question goes here)
EOS
doc = Nokogiri::HTML(html)
rows = doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr')
details = rows.collect do |row|
detail =
[
[:title, 'td[3]/div[1]/a/text()'],
[:name, 'td[3]/div[2]/span/a/text()'],
[:date, 'td[4]/text()'],
[:time, 'td[4]/span/text()'],
[:number, 'td[5]/a/text()'],
[:views, 'td[6]/text()'],
].each do |name, xpath|
detail[name] = row.at_xpath(xpath).to_s.strip
end
detail
end
pp details
# => [:time=>"23:35",
# => :title=>"Vb4 Gold Released",
# => :number=>"24",
# => :date=>"06 Jan 2010",
# => :views=>"1,320",
# => :name=>"Paul M"]
【讨论】:
我认为 css 等价物是doc.css('tbody#threadbits_forum_251 tr')
,但我实际上并没有在代码中测试过...
@Kejadlen,我用您的 doc.css 调用替换了 doc.xpath(...) 调用,效果很好。
有人会向我解释语法吗?提前谢谢你。
你被什么难住了?是 Ruby 语法、xpath 语法,还是两者兼而有之?
大多数情况下,因为哈希数组是可能工作的最简单的东西,这是一个更清晰的例子。另外,我不知道这对您是否重要,在 Ruby
以上是关于如何使用 Nokogiri 解析 HTML 表格?的主要内容,如果未能解决你的问题,请参考以下文章
创建“Nokogiri::XML”或“Nokogiri::HTML”对象时如何避免创建无意义的空白文本节点
[翻译][Ruby教程]Nokogiri - 解析HTML/XML文档 / Parsing an HTML/XML Document