我是Nokogiri和Ruby的新手。可以使用哪些XPath獲取包含第一段節點的所有文本節點?
我想獲取文檔中所有節點的文本,從第一段落節點開始幷包含它們。
我試圖使用XPath以下,但我還是一無所獲:
puts page.search("//p[0]/text()[next-sibling::node()]")
這是行不通的。我需要改變什麼?
我是Nokogiri和Ruby的新手。可以使用哪些XPath獲取包含第一段節點的所有文本節點?
我想獲取文檔中所有節點的文本,從第一段落節點開始幷包含它們。
我試圖使用XPath以下,但我還是一無所獲:
puts page.search("//p[0]/text()[next-sibling::node()]")
這是行不通的。我需要改變什麼?
您必須找到<p/>
節點並返回所有text()
節點,無論是內部還是後續節點。根據什麼樣的XPath功能引入nokogiri擁有,使用這些查詢之一:
//p[1]/(descendant::text() | following::text())
如果它不工作,用這個來代替,這需要找到第一款兩次,可能是一點點,但可能不易察覺,慢:
(//p[1]/descendant::text() | //p[1]/following::text())
甲可能不支持的XPath 2.0替代方法是:
//text()[//p[1] << .]
,意思是「由第一之前所有文本節點文檔中的節點「。
+1,但請注意,只有你的第二個表達式適用於Nokogiri。 – Phrogz 2013-04-07 21:20:36
這就是我所期望的,因此我提供了多個。我不確定第一個是否是有效的XPath 1.0,但是nokogiri不支持,或者它是否是XPath 2.0。作爲最後一個編寫該查詢的最優雅的版本,無論如何我都將其包含在內。 – 2013-04-07 21:33:58
@JensErat,非常感謝一位老兄,它像一個魅力。還有一件事,我的任務是解析這些德國網頁,然後基本上將文章內容分成句子和單詞,我的問題有正則表達式。我可以用英語完成這項工作,但是我不知道德文怎麼辦,分裂德文的最佳做法是什麼。 (我的正則表達式被元音和eszets弄糊塗了),我已經在php中嘗試了\ p {l}和\ x修飾符,但沒有運氣。如果你或其他人認爲他們可以幫助我,我會提供完整的example.thnx – user1895623 2013-04-08 11:20:03
這適用於引入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"]
注意,只是選擇文本節點本身返回NodeSet
的Nokogiri::XML::Text
對象,所以如果你只想要它們的文本內容,你必須通過.text
(或.content
)方法映射它們。
這看起來是正確的,但我不認爲[1]是必要的 – pguardiario 2013-04-08 00:26:12
@Progro,+1,謝謝這也適用。請你能幫助我的另一個問題(ive添加它作爲一個評論,下面jens erat的答案) – user1895623 2013-04-08 11:23:49
@ user1895623問它作爲[新問題](http://stackoverflow.com/questions/ask)。 – Phrogz 2013-04-08 12:51:42
提供有關XML的小樣本很重要。 – 2013-04-08 07:56:03
http://www.zeit.de/wirtschaft/2013-04/produkte-schwachstellen-garantie-hersteller – user1895623 2013-04-08 11:12:33
不,不是鏈接到你的樣本,把它的樣本放在問題中,足以證明問題和沒有更大。一個鏈接讓我們追逐我們需要的信息來幫助你,而且,因爲我們自願這樣做,在我們的業餘時間,你讓我們做了額外的工作來幫助你。不要這樣做。此外,鏈接斷裂,使你的問題在將來尋找相同問題的人毫無價值。 – 2013-04-08 14:13:56