2013-04-07 19 views
4

我是Nokogiri和Ruby的新手。可以使用哪些XPath獲取包含第一段節點的所有文本節點?

我想獲取文檔中所有節點的文本,從第一段落節點開始幷包含它們。

我試圖使用XPath以下,但我還是一無所獲:

puts page.search("//p[0]/text()[next-sibling::node()]") 

這是行不通的。我需要改變什麼?

+0

提供有關XML的小樣本很重要。 – 2013-04-08 07:56:03

+0

http://www.zeit.de/wirtschaft/2013-04/produkte-schwachstellen-garantie-hersteller – user1895623 2013-04-08 11:12:33

+0

不,不是鏈接到你的樣本,把它的樣本放在問題中,足以證明問題和沒有更大。一個鏈接讓我們追逐我們需要的信息來幫助你,而且,因爲我們自願這樣做,在我們的業餘時間,你讓我們做了額外的工作來幫助你。不要這樣做。此外,鏈接斷裂,使你的問題在將來尋找相同問題的人毫無價值。 – 2013-04-08 14:13:56

回答

4

您必須找到<p/>節點並返回所有text()節點,無論是內部還是後續節點。根據什麼樣的XPath功能引入nokogiri擁有,使用這些查詢之一:

//p[1]/(descendant::text() | following::text()) 

如果它不工作,用這個來代替,這需要找到第一款兩次,可能是一點點,但可能不易察覺,慢:

(//p[1]/descendant::text() | //p[1]/following::text()) 

甲可能不支持的XPath 2.0替代方法是:

//text()[//p[1] << .] 

,意思是「由第一之前所有文本節點文檔中的節點「。

+0

+1,但請注意,只有你的第二個表達式適用於Nokogiri。 – Phrogz 2013-04-07 21:20:36

+0

這就是我所期望的,因此我提供了多個。我不確定第一個是否是有效的XPath 1.0,但是nokogiri不支持,或者它是否是XPath 2.0。作爲最後一個編寫該查詢的最優雅的版本,無論如何我都將其包含在內。 – 2013-04-07 21:33:58

+0

@JensErat,非常感謝一位老兄,它像一個魅力。還有一件事,我的任務是解析這些德國網頁,然後基本上將文章內容分成句子和單詞,我的問題有正則表達式。我可以用英語完成這項工作,但是我不知道德文怎麼辦,分裂德文的最佳做法是什麼。 (我的正則表達式被元音和eszets弄糊塗了),我已經在php中嘗試了\ p {l}和\ x修飾符,但沒有運氣。如果你或其他人認爲他們可以幫助我,我會提供完整的example.thnx – user1895623 2013-04-08 11:20:03

2

這適用於引入nokogiri(代表在上面的libxml2和支持XPath 1.0表達式):

//p[1]//text() | //p[1]/following::text() 

證明:

require 'nokogiri' 

html = '<body><h1>A</h1><p>B <b>C</b></p><p>D <b>E</b></p></body>' 
doc = Nokogiri.HTML(html) 

p doc.xpath('//p[1]//text() | //p[1]/following::text()').map(&:text) 
#=> ["B ", "C", "D ", "E"] 

注意,只是選擇文本節點本身返回NodeSetNokogiri::XML::Text對象,所以如果你只想要它們的文本內容,你必須通過.text(或.content)方法映射它們。

+0

這看起來是正確的,但我不認爲[1]是必要的 – pguardiario 2013-04-08 00:26:12

+0

@Progro,+1,謝謝這也適用。請你能幫助我的另一個問題(ive添加它作爲一個評論,下面jens erat的答案) – user1895623 2013-04-08 11:23:49

+0

@ user1895623問它作爲[新問題](http://stackoverflow.com/questions/ask)。 – Phrogz 2013-04-08 12:51:42

相關問題