Nokogiriでテキストノードの内容を取得するクリーンな方法はありますか?今すぐ使用していますNokogiriテキストノードの内容
some_node.at_xpath("//whatever").first.content
これはちょうどテキストを取得するためのものです。
Nokogiriでテキストノードの内容を取得するクリーンな方法はありますか?今すぐ使用していますNokogiriテキストノードの内容
some_node.at_xpath("//whatever").first.content
これはちょうどテキストを取得するためのものです。
あなたが欲しいですのみ本文は?
doc.search('//text()').map(&:text)
多分空白とノイズが欲しいとは限りません。あなたは単語の文字を含む唯一のテキストノード、
doc.search('//text()').map(&:text).delete_if{|x| x !~ /\w/}
編集をしたい場合は:それはあなたが唯一の単一ノードのテキストコンテンツを望んで表示されます。
some_node.at_xpath("//whatever").text
だけでテキストノードを探します。
require 'nokogiri'
doc = Nokogiri::HTML(<<EOT)
<html>
<body>
<p>This is a text node </p>
<p> This is another text node</p>
</body>
</html>
EOT
doc.search('//text()').each do |t|
t.replace(t.content.strip)
end
puts doc.to_html
出力する:
<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN" "http://www.w3.org/TR/REC-html40/loose.dtd">
<html><body>
<p>This is a text node</p>
<p>This is another text node</p>
</body></html>
ところで、あなたのコード例では動作しません。 at_xpath("//whatever").first
は冗長であり、失敗します。 at_xpath
は最初のオカレンスだけを検出し、ノードを返します。ノードがfirst
メソッドを持たないので、その時点ではfirst
は余分です。
私は
doc.xpath_at("//data/foo").children.first.content
を行わず、 "バー" のテキストで取得する方法、<data><foo>bar</foo></bar>
を持っていますか?doc
を想定し
は、解析されたDOMが含まれています
doc.to_xml # => "<?xml version=\"1.0\"?>\n<data>\n <foo>bar</foo>\n</data>\n"
は、最初に出現します:
doc.at('foo').text # => "bar"
doc.at('//foo').text # => "bar"
doc.at('/data/foo').text # => "bar"
は、すべてのオカレンスを取得し、最初の1を取る:
doc.search('foo').first.text # => "bar"
doc.search('//foo').first.text # => "bar"
doc.search('data foo').first.text # => "bar"
ええと、申し訳ありませんが、私はchildren.first意味しました。コンテンツ。あなたの例はまさに私が望むものではありません - 私は
あなたがしたいことについてはっきりすることは本当に重要です。私たちはあなたを助けてくれません。追加された内容を参照してください。 –
私は思った - 私はxpath_atは、私が探していたノードを正確に知っていて、ちょうど愚かな方法で内容を取得していたことをかなり明確にしたと思った。 – cbmanica
私はこの答えを受け入れています。なぜなら、それは私が望むものではなく、それが私の望むもの、すなわちテキストメソッドを含んでいるからです。ありがとう! – cbmanica
フォローアップ:空白でないテキストノードをすべて見つけて、Railsを使っている場合は、 'present?'と 'blank?'メソッドがあります。 map(&:text).delete_if&:blank? 'または' doc.search( '// text()')。map(& &:text).keep_if&:present? ' –