【问题标题】:Getting HTML table values using XPath in Nokogiri?在 Nokogiri 中使用 XPath 获取 HTML 表值?
【发布时间】:2013-04-27 14:11:29
【问题描述】:

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

谁能帮帮我?

【问题讨论】:

    标签: ruby xpath web-scraping nokogiri


    【解决方案1】:

    从 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 中的任何内容发生变化,这将增加您成功的机会。

    【讨论】:

    • 全部?因为在 html 文件中,所有这些都是指定的(由程序员编写)。
    • 你的table#foo'div.bar table' 很有趣。你能给我一个我可以看到这种短手牌的来源吗?
    • 这些是标准的 CSS 访问器。 Nokogiri 支持与 jQuery 兼容的 XPath 和 CSS 访问器。我喜欢 CSS,因为它通常更具可读性;我认为 XPath 能够做得更多,但在我看来它也更难阅读,所以我根据需要来回调整。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-01-14
    • 1970-01-01
    • 2011-01-06
    相关资源
    最近更新 更多