2012-10-25 93 views
5

我是XPath新手,對我來說似乎有點棘手;有時候我發現它不是我認爲它應該工作的方式。XPath與nokogiri一起;教程/例子嗎?

當我湊使用XPath和引入nokogiri從網站的數據,我覺得很難,如果網站具有複雜的結構吧。我使用FirePath來獲取元素的XPath,但有時它似乎不起作用。我必須刪除瀏覽器添加的額外標籤,如tbody

我真的很想知道,如果有一些很好的教程和XPath和引入nokogiri的例子。在Google搜索後我找不到多少東西。

+0

關於Nokogiri的好處之一是它也支持CSS訪問器。有時CSS是更快的路徑,有時XPath是。如有必要,請隨意互換使用。 –

+0

是的,我使用兩個,CSS選擇器和XPath。兩者結合使用確實更加強大。 –

回答

14

使用Nokogiri或任何XML/HTML解析器查找元素或元素組的最大訣竅是從一個簡短的訪問器開始,找到所需的一般附近,然後迭代地添加對它進行微調,直到你有你想要的。

第二個技巧是記住使用//來啓動XPath,而不是/,除非您確定要從文檔的根目錄開始。 //就像是Linux中的命令行中的'**/*'通配符。它到處搜索。

此外,不要信任由瀏覽器提供的XPath或CSS訪問。他們會對HTML源代碼進行各種修正,包括tbody,就像您看到的一樣。相反,使用Ruby的OpenURI或curlwget來檢索原始來源,並使用編輯器(如vivim)或使用lesscat來查看它到屏幕。沒有機會以這種方式對文件進行任何更改。最後,使用XPath將搜索分解爲塊通常更容易/更快,然後讓Ruby遍歷事物,而不是嘗試想出難以維護或更脆弱的複雜XPath。

Nokogiri本身很容易。大部分您想要做的事情都是兩種不同方法的簡單組合:searchat。兩者都採用CSS或XPath選擇器。 search,以及其兄弟方法xpathcss,返回一個NodeSet,它基本上是一個可以迭代的節點數組。 at,css_atxpath_at返回與CSS或XPath訪問器匹配的第一個節點。在所有這些方法中,...xpath變體接受XPath,而...css變體接受CSS訪問器。

一旦你有一個節點,通常你會想做兩件事之一,要麼提取一個參數,要麼得到它的文本/內容。您可以使用[attribute_to_get]和使用text的文本輕鬆獲取屬性。

使用這些方法,我們可以搜索頁面中的所有鏈接,並返回其文本和相關HREF,使用類似:

require 'awesome_print' 
require 'nokogiri' 
require 'open-uri' 
doc = Nokogiri::HTML(open('http://www.example.com')) 
ap doc.search('a').map{ |a| [a['href'], a.text] }[0, 5] 

,輸出:

[ 
    [0] [ 
     [0] "/", 
     [1] "" 
    ], 
    [1] [ 
     [0] "/domains/", 
     [1] "Domains" 
    ], 
    [2] [ 
     [0] "/numbers/", 
     [1] "Numbers" 
    ], 
    [3] [ 
     [0] "/protocols/", 
     [1] "Protocols" 
    ], 
    [4] [ 
     [0] "/about/", 
     [1] "About IANA" 
    ] 
] 
+0

Nokogiri很容易。在我的答案中查看我的其他文字。 –

8

我還發現,有使用引入nokogiri和XPath在開始時相當陡峭的學習曲線,但大量的試驗和錯誤後,我現在已經成功地利用這兩者的懸掛,所以掛在那裏! Nokogiri非常強大,非常值得學習。

關於教程/例子,我想你已經看到了引入nokogiri tutorials page。我可以想像,如果你不習慣的XPath,XML解析等

一些其他可能的資源,這些教程的水平可能是有點高:

在XPath上,我建議閱讀this summary in five paragraphs。其核心XPath非常簡單,只是非常不直觀!我發現CSS更容易記住,我不認爲我是唯一。

但在最後,而教程將幫助,你能做的最好的事情就是剛剛破解打開控制檯,require 'nokogiri'開始埋頭苦幹。過了一段時間,它將開始有意義。

+0

感謝您的回答。我知道我需要練習很多才能到達start_making_sense的地方。祝你好運,再次感謝。 –

+0

而且,我從這個答案中學到了一些關於xpath的優秀的東西:http://stackoverflow.com/questions/2080799/how-to-use-xpath-nokogiri?lq=1 –

+0

很高興我可以幫忙!祝你好運。 –