无法提取html表行

时间:2011-11-20 21:11:49

标签: html ruby xpath web-scraping hpricot

enter image description here

我尝试提取上表中列出的所有五行。

我正在使用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

2 个答案:

答案 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/trtable//tr。当您使用table/tr时,您会专门寻找<tr> <table>的直接后代,但是从您的图片来看,这不是标记的结构。