2012-08-16 8 views
7

Nokogiriでテキストノードの内容を取得するクリーンな方法はありますか?今すぐ使用していますNokogiriテキストノードの内容

some_node.at_xpath("//whatever").first.content 

これはちょうどテキストを取得するためのものです。

答えて

12

あなたが欲しいですのみ本文は?

doc.search('//text()').map(&:text) 

多分空白とノイズが欲しいとは限りません。あなたは単語の文字を含む唯一のテキストノード、

doc.search('//text()').map(&:text).delete_if{|x| x !~ /\w/} 

編集をしたい場合は:それはあなたが唯一の単一ノードのテキストコンテンツを望んで表示されます。

some_node.at_xpath("//whatever").text 
+0

私はこの答えを受け入れています。なぜなら、それは私が望むものではなく、それが私の望むもの、すなわちテキストメソッドを含んでいるからです。ありがとう! – cbmanica

+0

フォローアップ:空白でないテキストノードをすべて見つけて、Railsを使っている場合は、 'present?'と 'blank?'メソッドがあります。 map(&:text).delete_if&:blank? 'または' doc.search( '// text()')。map(& &:text).keep_if&:present? ' –

7

だけでテキストノードを探します。

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" 
+0

ええと、申し訳ありませんが、私はchildren.first意味しました。コンテンツ。あなたの例はまさに私が望むものではありません - 私はバーを持っているとしましょう。doc.xpath_at( "// data/foo").children.firstを実行せずにどのように "bar"テキストを取得しますか?コンテンツ? – cbmanica

+0

あなたがしたいことについてはっきりすることは本当に重要です。私たちはあなたを助けてくれません。追加された内容を参照してください。 –

+0

私は思った - 私はxpath_atは、私が探していたノードを正確に知っていて、ちょうど愚かな方法で内容を取得していたことをかなり明確にしたと思った。 – cbmanica