0

我正在尝试使用该表的 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,所以我认为它是正确的。

谁能帮我?

4

1 回答 1

4

tbody/从您的 XPath 中删除。

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

即使使用“查看源代码”也会让您感到困惑,因为您希望这是准确的,但浏览器已经将内容修改为包含“tbody”,所以,好吧,基本上他们在骗你。

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


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

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

我现在无法访问服务器,所以我无法确认,或者深入研究层次结构应该是什么,并展示一个例子。(这就是为什么在你的问题中给我们真正的 HTML 比一个可能不起作用的链接要好得多。)

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

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

于 2013-04-26T18:24:47.417 回答