Как мне получить несколько экземпляров паттерна с помощью Nokogiri? - PullRequest
1 голос
/ 10 февраля 2012

Вот пример HTML-кода, который я сканирую.

<div class="text">
 <h3>
  <a href="http://www.faith.co.uk/">
    Rodeo Sinclair
  </a>
 </h3>
.
.
.
h3>
 <a href="http://www.hate.co.uk/">
   Morvern
 </a>
</h3>

и вот мой код.

require 'nokogiri'
require 'open-uri'

doc = Nokogiri::HTML(open(url))

output = doc.css('div h3 a').attr("href")

Проблема в том, что он выводит только первый URL. Как мне получить оба?

Ответы [ 2 ]

2 голосов
/ 10 февраля 2012
doc = Nokogiri::HTML(open(url))
output = doc.css('div h3 a').map{|x| x['href']}

Вы можете использовать что-то вроде map для захвата всех узлов.

0 голосов
/ 11 февраля 2012
doc = Nokogiri::HTML(open(url))
output = doc.css('div h3 a')

output.class # => Nokogir :: XML :: NodeSet

Nokogir :: XML :: NodeSet является классом, подобным массиву, поэтому (если говорить просто) вы можете ожидать NokogirОбъекты :: XML :: NodeSet ведут себя как массивы при вызове стандартных итеративных методов или [].

В вашем примере вывод содержит все вхождения: a теги находятся в пределах h3 тегов, которые в свою очередь находятся в пределах div тегов. (2 попадания)

, поэтому вы можете:

output[0].attr('href') # => "http://www.faith.co.uk/"
output[1].attr('href') # =>" http://www.hate.co.uk/"

output.each do |node|
  puts "Link says: " + node.content
end

Ссылка говорит: Родео СинклерСсылка говорит: Morvern

output.map do |node|
  node.attr('href')
end

# => ['http://www.faith.co.uk/',' http://www.hate.co.uk/']
и так далее ...

иди и проверь nokogiri.org для большего количества примеров и вглубинные объяснения.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...