2013-04-26 83 views
0

我試圖讓使用此表的XPath的一個表中的一些值,但它只返回[](空):在Nokogiri中使用XPath獲取HTML表值?

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 

我發現表的XPath的使用Firebug,所以我認爲這是正確的。

任何人都可以幫助我嗎?

回答

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中發生任何變化,這將增加您成功的可能性。

+0

所有這些?因爲在html文件中,所有這些都是指定的(由程序員編寫)。 – vhbsouza 2013-04-26 18:27:19

+0

它繼續錯誤。 :( – vhbsouza 2013-04-26 18:35:01

+0

你的'table#foo'和''div.bar table''很有意思。你能給我一個我能看到這麼短的手的源碼嗎? – 2013-04-26 19:04:33