Что такое XPATH для простого брата? - PullRequest
3 голосов
/ 23 января 2012

Пример:

<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 ]

2 голосов
/ 23 января 2012

Использование программирования в функциональном стиле для создания карты от меток до значений:

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 дает текстовое содержимое.

2 голосов
/ 23 января 2012

Если текущий узел:

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

, то это выражение XPath:

following-sibling::node()[1]

выбирает нужный текстовый узел:

"  PeterPan"
...