什么是简单兄弟的XPATH?

时间:2012-01-22 21:11:18

标签: ruby xpath nokogiri siblings

样品:

<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 个答案:

答案 0 :(得分:2)

如果当前节点是:

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

然后这个XPath表达式:

following-sibling::node()[1]

选择想要的文本节点:

"  PeterPan"

答案 1 :(得分: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提供文字内容的事实。