在Nokogiri中使用XPath获取HTML表值?

时间:2013-04-26 18:21:28

标签: ruby xpath web-scraping nokogiri

我正在尝试使用此表的XPath从表中获取某些值,但它只返回[](空):

require 'nokogiri'
require 'open-uri'

url = "http://riopretrans.com.br/linhas.php?ln=106"

doc = Nokogiri::HTML(open(url))
doc.xpath("html/body/table[1]/tbody/tr[2]/td/table/tbody/tr/td/table/tbody/tr[2]/td/div/table[1]/tbody/tr[3]/td/div/div/center/font/table").each do |lines|
    puts lines.content
end

我使用Firebug找到了表的XPath,所以我认为这是正确的。

任何人都可以帮助我吗?

1 个答案:

答案 0 :(得分:4)

从XPath中删除tbody/

tbody标记是table标记的HTML规范的一部分,但实际上很少在HTML中实现。有些浏览器会插入它,但它不在页面的HTML中。然后Firebug看到它,你看,并认为它一定是这样。

即使使用“查看源代码”也会让您感到困惑,因为您希望它是准确的,但是浏览器已经将内容包含在“tbody”中,所以,基本上它们对您撒谎。

您可以通过查看Nokogiri获取的HTML来确认这一点。使用puts doc.to_html['tbody'],看看您是"tbody"还是nil


  

...因为在html文件中所有这些都是指定的(由程序员编写)

如果你是肯定的,他们实际上属于那里,因为它们存在于HTML源代码中,那么你需要拆开你的XPath。从宽阔的路径开始,然后慢慢添加以缩小搜索范围。

我现在无法访问服务器,所以我无法确认,或者深入了解层次结构应该是什么,并展示一个示例。 (这就是为什么在你的问题中真正给我们提供真实HTML的原因远比一个可能无效的链接好得多。)

另一种方法是使用XPath的//(在任何地方搜索),限制较少的路径或CSS选择器。无论哪种方式,实际上检查HTML,而不是依赖于Firebug的XPath,并确定您可以在源中使用哪些“地标”导航到您想要的表。今天的HTML充满了idclass个参数,或者是一系列特定的标签,可以作为所需表格的指纹。搜索精确定位该表所需的最小值。

如果表格类似<table id="foo">,则使用doc.at('table#foo')。如果它在<div class="bar"><table>使用doc.at('div.bar table')。在任何情况下,使用必要的最小尺寸的访问器来完成工作。如果将来HTML中的任何内容发生变化,这将增加您成功的机会。