无法提取HTML表格行

4

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

@JoshuaClark 这是您要的。 - Terry Li
2个回答

9
所涉及的HTML文档无效。(请参见http://validator.w3.org/check?uri=http%3A%2F%2Fwww.utm.utoronto.ca%2F7800.0.html。) Hpricot解析它的方式与您的浏览器不同,因此结果不同,但不能真正归咎于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

也许你应该切换?

0

table/tr路径不存在。正确的路径应该是table/tbody/tr或者table//tr。当你使用table/tr时,你是在寻找一个直接位于<table>下的<tr>元素,但从你提供的图片来看,这并不是标记的结构。


1
此示例中不存在 tbody 标签。Firefox 扩展程序 firebug 为我们添加了额外的标签。如我在原始问题中提到的,table/tr 在这里起作用,但只是部分地起作用。我能够提取前三行,但不能提取最后两行,这真的很奇怪。 - Terry Li
我没有意识到firebug会添加额外的标签。这就解释了为什么今天我在使用nokogiri和firebug一起定位我关心的TR行时遇到了如此困难。(我有一个嵌套在另一个表中而没有ID的表格。)现在我想知道HTML是否一开始就无效。 - beach

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