の直接の子である非空のテキストノードを返す必要があります私はこのようにそれを行うだろう:
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<span>
<a href="some_other_url">Another name I already got easily</a>
<br>
Some other text I need to get but just can't
</span>
EOT
doc.at('span br').next.text # => "\n Some other text I need to get but just can't\n"
か
doc.at('//span/br').next.text # => "\n Some other text I need to get but just can't\n"
結果の文字列を簡単にクリーニングする:
"\n Some other text I need to get but just can't\n".strip # => "Some other text I need to get but just can't"
あなたのコードは、あなたが望む結果を得るためにDOMに深く十分に見ていないされている、プラスあなたが間違ったことをやっている問題:
doc.at_xpath('//span').to_s # => "<span>\n <a href=\"some_other_url\">Another name I already got easily</a>\n <br>\n Some other text I need to get but just can't\n</span>"
to_s
は同じですto_html
を返し、ノードを元のマークアップに戻します。あなたがそのテキストを取得することはできませんコンテナではありません
doc.at_xpath('//span').text # => "\n Another name I already got easily\n \n Some other text I need to get but just can't\n"
<br>
ので、しかし:text
を使用すると、タグを取り除く、近くにあなたを取得され、しかし、再び、あなたはあまりにも遠く戻って立っているだろうその後、
doc.at('span br').next.class # => Nokogiri::XML::Text
XML/HTMLを解析し、それはあなたがしたい、実際のノードを指すように本当に重要だ、と:まだナビゲートするために使用することができ、その後、Textノードであるnext
ノードを取得し、それを取得適切な方法を使用してください。そうしないと、あなたが望む実際のデータを取得しようとするフープを飛び越さなければなりません。あなたが/スピンドルを折り畳むことができ
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<span>
<a href="some_other_url">Another name I already got easily</a>
<br>
Some other text I need to get but just can't
</span>
EOT
data = doc.search('span').map{ |span|
name = span.at('a').text
url = span.at('a')['href']
party = span.at('br').next.text.strip
{
name: name,
url: url,
party: party
}
}
# => [{:name=>"Another name I already got easily", :url=>"some_other_url", :party=>"Some other text I need to get but just can't"}]
/あなたの意志にそれを曲げるために不具:すべて一緒に、私は何かのようにしてくださいすることを置く
。
最後に、search('//path/to/some/node/text()').text
をしないでください。あなたは、キー入力やCPUを無駄にしている:
doc = Nokogiri::HTML(<<EOT)
<p>
Some other text I need to get but just can't
</p>
EOT
doc.at('//p') # => #<Nokogiri::XML::Element:0x3fed0841edf0 name="p" children=[#<Nokogiri::XML::Text:0x3fed0841e918 "\n Some other text I need to get but just can't\n">]>
doc.at('//p/text()') # => #<Nokogiri::XML::Text:0x3fed0841e918 "\n Some other text I need to get but just can't\n">
text()
は、テキストノードを返しますが、それはテキストを返しません。
doc.at('//p/text()').text # => "\n Some other text I need to get but just can't\n"
代わりに、あなたは鋸山をしたいと言うことでポイントがそれを得る:
doc.at('//p').text # => "\n Some other text I need to get but just can't\n"
XPathがノードを指すことができ、それを
は、結果として、あなたは何を余儀なくされていますテキストが必要なときに助けにならないので、セレクタを単純化してください。
'span/text()'を試してください。 –
私はそれをして空になります。 –
'to_s'と' text'の違いと、Nokogiriの 'text'メソッドを使ってXPathで' text() 'セレクタを使うタイミングを知る必要があります。私の答えを見てください。 –