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

또는

following-sibling::node()[1] 

는 원하는 텍스트 노드를 선택 더 간단하게 다음과 같이 표시 할 수 있습니다.

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 루비 솔루션에 대해 +1하고 편집 해 주셔서 감사합니다. –

2

을 :

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

다음이 XPath 식 :

" PeterPan"