5

私は Nokogiri と Ruby 全般に不慣れです。

ドキュメント内の最初の段落ノードから始まるすべてのノードのテキストを取得したいと考えています。

XPathで次のことを試しましたが、どこにも行きません:

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

これはうまくいきません。何を変更する必要がありますか?

4

2 に答える 2

4

ノードを見つけて、内部と後続の両方の<p/>すべてのノードを返す必要があります。text()Nokogiri が持つ XPath 機能に応じて、次のクエリのいずれかを使用します。

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

うまくいかない場合は、代わりにこれを使用してください。最初の段落を 2 回検索する必要があり、少し遅くなる可能性がありますが、おそらく気付かないほど遅くなります。

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

おそらくサポートされていない XPath 2.0 の代替手段は次のとおりです。

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

<p/>これは、「ドキュメント内の最初のノードが先行するすべてのテキスト ノード」を意味します。

于 2013-04-07T20:06:02.600 に答える
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"]

テキスト ノード自体を選択するだけNodeSetで のオブジェクトが返されるので、それらのテキスト コンテンツのみが必要な場合は、 (または) メソッドNokogiri::XML::Textを介してそれらをマップする必要があることに注意してください。.text.content

于 2013-04-07T21:17:40.920 に答える