私は Nokogiri と Ruby 全般に不慣れです。
ドキュメント内の最初の段落ノードから始まるすべてのノードのテキストを取得したいと考えています。
XPathで次のことを試しましたが、どこにも行きません:
puts page.search("//p[0]/text()[next-sibling::node()]")
これはうまくいきません。何を変更する必要がありますか?
ノードを見つけて、内部と後続の両方の<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/>
これは、「ドキュメント内の最初のノードが先行するすべてのテキスト ノード」を意味します。
これは 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