鋸山

2012-05-29 11 views
17

にタグ内に直接テキストを取得し、私は次のようになり、いくつかのHTMLを持っています。それが存在すれば、2009年を解析する必要があります。鋸山

dtタグ内のテキストは取得できますが、aタグ内のテキストは取得できません。私はrecord.search("dt").inner_textを使用して、これは私にすべてを与える。

これは簡単な質問ですが、これを把握することはできませんでした。

+1

なお 'dt'(内部2つのテキストノードが使用する場合を除き、実際に存在していることも:

def own_text(node) # Find the content of all child text nodes and join them together node.xpath('text()').text end 

ここで代替、楽しい答え:)

行動にみる
def own_text(node) node.clone(1).tap{ |copy| copy.element_children.remove }.text end 

です'noblanks'オプションを使用してHTMLを解析します):最初のテキストノードは' 'の前に '' \ n "'、2番目のテキストノードは '" \ n(2009)\ n "'です。 – Phrogz

答えて

16

は、あなたがそうのようなXPathを使用することができ、すべてのテキストとの直接の子ではなく、それ以上のサブ子を取得するには:

doc.xpath('//dt/text()') 

それとも、検索を使用する場合:XPathのトンを使用して

doc.search('dt').xpath('text()') 
+3

上記のメソッドは、['XML :: Text'](http://nokogiri.org/Nokogiri/XML/Text.html)ノードのNodeSetを提供します。単一の結果を得るために 'at_xpath'(または単に' at')を使い、そのノード上の '.content'や' .text'メソッドを呼び出してテキストを文字列として取得することができます。 – Phrogz

5

dt要素は、2人の子供がいるので、あなたはでそれにアクセスすることができます。

doc.search("dt").children.last.text 
7

oあなたが望むものを正確に選択する(@ Casperによって提案されるように)正しい答えです。

require 'nokogiri' 
root = Nokogiri.XML('<r>hi <a>BOO</a> there</r>').root 
puts root.text  #=> hi BOO there 
puts own_text(root) #=> hi there 
関連する問題