2012-01-22 22 views
2

サンプル:シンプルな兄弟のためのXPATHは何ですか?

<p> 
<span class="label">Name:</span> PeterPan<br> 
<span class="label">Tag:</span> Critical<br> 
<span class="label">Priority:</span> 223<br> 
</p> 

私は以下のコードを使用していますが、私が手:

Name:| 
Tag:| 
Priority: 

doc.xpath("//p/span").each do |para_tag| 
    puts para_tag.text 
end 

が、私は次の詳細が必要になります。

Name: PeterPan | Tag: Critical | Priority: 223 

答えて

2

labels = Hash[ 
    doc.css('span.label').map do |s| 
    [ 
     s.text[0..-2], # get rid of the trailing colon 
     s.at_xpath('following-sibling::text()').content.strip 
    ] 
    end 
] 
p labels 
#=> {"Name"=>"PeterPan", "Tag"=>"Critical", "Priority"=>"223"} 

かもっと簡単に表示することができます:

doc.css('span.label').each{ |s| puts "#{s.text} -- #{s.next_sibling}" } 
#=> Name: --  PeterPan 
#=> Tag: --   Critical 
#=> Priority: --   223 

next_siblingを使用して、次のテキストを検索し、Nokogiri::XML::Text#to_sがテキストの内容を示すことを利用してください。

+0

ルビーの解決策+1と編集していただきありがとうございます。 –

2

現在のノードがある場合:

<span class="label">Name:</span> 

このXPath式:

following-sibling::node()[1] 

募集テキストノードを選択します。

値にラベルからマップを作成するために、機能的スタイルのプログラミングを使用して
" PeterPan" 
関連する問題