2010-01-17 71 views
21

我還沒有找到任何文檔或教程。有這樣的事嗎?如何在Nokogiri中使用XPath?


doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr') 

上面的代碼會得到我的任何table,任何地方,有一個tbody孩子與屬性id等於「threadbits_forum_251」。但爲什麼它以雙重//開頭?爲什麼最後有/tr?有關更多詳細信息,請參閱「Ruby Nokogiri Parsing HTML table II」。


誰能告訴我怎麼hrefidaltsrc等,採用引入nokogiri提取?

td[3]/div[1]/a/text()' <--- extracts text 

我該如何提取其他東西?

回答

41

看來你需要閱讀XPath Tutorial

//table/tbody[@id="threadbits_forum_251"]/tr表達的意思是:

  • // - XML文檔港九
  • ​​- 以表格元素與TBODY孩子
  • [@id="threadbits_forum_251"] - 其中 id屬性等於「threadbits_forum_251」
  • tr - 並利用其tr元素

所以,基本上,你需要知道:

  • 屬性與@
  • 條件開始往裏走[]括號

如果我正確理解API,你可以用doc.xpath("td[3]/div[1]/a")["href"]td[3]/div[1]/a/@href f只有一個<a>元素。

+0

@Rubens謝謝你。你是對的我需要閱讀XPath Tutorial.I認爲這是我需要閱讀的nokorigi文檔...你知道是否有任何工具可以給我完整的Xpath,如果我點擊並在HTML頁面上的對象? – Radek 2010-01-17 11:50:58

+8

我不知道,但XPath並不那麼辛苦;考慮你的文件系統,並假設每個文件夾都是一個XML元素;所以,當你選擇你的'system32'文件夾時,你會得到'\ windows \ system32'路徑;只需用'/'替換'\\'',考慮以'@'開頭的屬性和'']'的條件,你很好去 – 2010-01-17 12:01:48

+2

我知道這是一個較老的答案,但是xpath教程的鏈接是現在打破了。我認爲現在應該是http://www.w3schools.com/xsl/xpath_intro.asp – Axiombadger 2016-02-17 13:06:41

6

你的XPath是正確的,你似乎已經回答了你自己的問題的第一部分(幾乎):

doc.xpath('//table/tbody[@id="threadbits_forum_251"]/tr') 

「上面的代碼會得到我任何 表的TR,隨時隨地,有一個TBODY孩子id屬性等於threadbits_forum_251"


//指下列元素可以在文檔中任何地方出現。

/tr最後意思是,獲取匹配元素的節點tr

你不需要逐個提取每個屬性。剛剛獲得包含引入nokogiri所有四個屬性的整個節點,並使用獲得的屬性:

theNode['href'] 
theNode['src'] 

哪裏theNode是你引入nokogiri Node對象。


編輯:

對不起,我沒有使用這些庫,但我認爲XPath的評估和分析正在由機械化完成。因此,您將如何一次性獲得整個元素及其屬性。

doc.xpath("td[3]/div[1]/a").each do |anchor| 
    puts anchor['href'] 
    puts anchor['src'] 
    ... 
end 
+0

@Anurag謝謝你的好解釋。我使用機械化不是純粹的nokogiri,我可以用[:href']莫名其妙[:title, 'TD [3]/DIV [1] /一個/文本()'] ,?我想提取href而不是文本 – Radek 2010-01-17 11:48:57

+1

'[:address,'td [3]/div [1]/a/@ href']'? – 2010-01-17 11:51:48

+0

我正在尋找nokogiri教程,並遇到了我自己的答案..呵呵:) – Anurag 2011-04-21 19:32:19