我正在尝试使用此表的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,所以我认为这是正确的。
任何人都可以帮助我吗?
答案 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充满了id
和class
个参数,或者是一系列特定的标签,可以作为所需表格的指纹。搜索精确定位该表所需的最小值。
如果表格类似<table id="foo">
,则使用doc.at('table#foo')
。如果它在<div class="bar"><table>
使用doc.at('div.bar table')
。在任何情况下,使用必要的最小尺寸的访问器来完成工作。如果将来HTML中的任何内容发生变化,这将增加您成功的机会。