我尝试提取上表中列出的所有五行。
我正在使用Ruby hpricot库使用xpath表达式提取表行。
在我的例子中,我使用的xpath表达式是/ html / body / center / table / tr。请注意,我已从表达式中删除了tbody标记,这通常是成功提取的情况。
奇怪的是,我在结果的前三行中丢失了最后两行。我只是不知道那里发生了什么。
编辑:没有任何关于代码的魔力,只需根据要求附加它。
require 'open-uri'
require 'hpricot'
faculty = Hpricot(open("http://www.utm.utoronto.ca/7800.0.html"))
(faculty/"/html/body/center/table/tr").each do |text|
puts text.to_s
end
答案 0 :(得分:9)
有问题的HTML文档无效。 (参见http://validator.w3.org/check?uri=http%3A%2F%2Fwww.utm.utoronto.ca%2F7800.0.html。)Hpricot以不同于浏览器的方式解析它 - 因此结果不同 - 但实际上并不能归咎于它。在HTML5之前,没有关于如何解析无效HTML文档的标准。
我尝试用Nokogiri替换Hpricot,它似乎给了预期的解析。代码:
require 'open-uri'
require 'nokogiri'
faculty = Nokogiri.HTML(open("http://www.utm.utoronto.ca/7800.0.html"))
faculty.search("/html/body/center/table/tr").each do |text|
puts text
end
也许你应该转换?
答案 1 :(得分:0)
路径table/tr
不存在。它是table/tbody/tr
或table//tr
。当您使用table/tr
时,您会专门寻找<tr>
<table>
的直接后代,但是从您的图片来看,这不是标记的结构。