Warning: file_get_contents(/data/phpspider/zhask/data//catemap/3/xpath/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ruby 在Nokogiri中使用XPath获取HTML表值?_Ruby_Xpath_Web Scraping_Nokogiri - Fatal编程技术网

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

Ruby 在Nokogiri中使用XPath获取HTML表值?,ruby,xpath,web-scraping,nokogiri,Ruby,Xpath,Web Scraping,Nokogiri,我试图使用此表的XPath从表中获取一些值,但它只返回[](空): 我使用Firebug找到了表的XPath,所以我认为它是正确的 有人能帮我吗?从XPath中删除tbody/ tbody标记是table标记的HTML规范的一部分,但很少在HTML中实际实现。有些浏览器会插入它,尽管它不在页面的HTML中。然后萤火虫看到了它,你们看到了,并且认为它一定是这样 即使使用“查看源代码”也会让你感到困惑,因为你希望这是准确的,但浏览器已经将内容包含在“tbody”中,所以,好吧,基本上他们在骗你 您可

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

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


有人能帮我吗?

从XPath中删除
tbody/

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

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

您可以通过查看Nokogiri获得的HTML来确认这一点。使用
将doc.放到html['tbody']
中,然后查看是否得到
的“tbody”


…因为在html文件中,它们都是指定的(由程序员编写)

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

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

另一种方法是使用XPath的
/
(搜索任意位置)和限制较少的路径,或者CSS选择器。不管是哪种方式,都要检查HTML,而不是依赖Firebug的XPath,并确定可以在源代码中使用哪些“地标”来导航到所需的表。今天的HTML充满了
id
class
参数,或者一系列特定的标记,它们可以作为所需表格的指纹。搜索固定该表所需的最小值


如果该表类似于
,则使用
doc.at('table#foo')
。如果它位于
中,请使用
doc.at('div.bar table')
。在任何情况下,使用完成任务所需的最小大小的访问器。如果HTML中的任何内容将来发生更改,这将增加成功的机会。

从XPath中删除
tbody/

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

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

您可以通过查看Nokogiri获得的HTML来确认这一点。使用
将doc.放到html['tbody']
中,然后查看是否得到
的“tbody”


…因为在html文件中,它们都是指定的(由程序员编写)

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

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

另一种方法是使用XPath的
/
(搜索任意位置)和限制较少的路径,或者CSS选择器。不管是哪种方式,都要检查HTML,而不是依赖Firebug的XPath,并确定可以在源代码中使用哪些“地标”来导航到所需的表。今天的HTML充满了
id
class
参数,或者一系列特定的标记,它们可以作为所需表格的指纹。搜索固定该表所需的最小值


如果该表类似于
,则使用
doc.at('table#foo')
。如果它位于
中,请使用
doc.at('div.bar table')
。在任何情况下,使用完成任务所需的最小大小的访问器。如果HTML中的任何内容在将来发生更改,这将增加您成功的机会。

所有这些内容?因为在html文件中,它们都是指定的(由程序员编写的)。您的
表#foo
“div.bar表”
很有趣。你能给我一个能看到这么多速记图片的来源吗?这些都是标准的CSS访问器。Nokogiri支持与jQuery兼容的XPath和CSS访问器。我喜欢CSS,因为它通常更可读;我认为XPath可以做得更多,但在我看来,它也更难阅读,所以我会根据需要来回调整。所有这些?因为在html文件中,它们都是指定的(由程序员编写的)。您的
表#foo
“div.bar表”
很有趣。你能给我一个能看到这么多速记图片的来源吗?这些都是标准的CSS访问器。Nokogiri支持与jQuery兼容的XPath和CSS访问器。我喜欢CSS,因为它通常更可读;我认为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