2012-01-22 74 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"