如何使用Nokogiri获取模式的多个实例?

时间:2012-02-10 11:29:21

标签: ruby

以下是我正在扫描的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")

问题是,它只输出第一个网址。我如何获得两者?

2 个答案:

答案 0 :(得分:2)

doc = Nokogiri::HTML(open(url))
output = doc.css('div h3 a').map{|x| x['href']}

您可以使用map之类的内容来捕获所有节点。

答案 1 :(得分:0)

doc = Nokogiri::HTML(open(url))
output = doc.css('div h3 a')

output.class#=&gt; Nokogir :: XML ::节点集

Nokogir :: XML :: NodeSet是一个“类似于”类,所以(简单来说)你可以期待Nokogir :: XML :: NodeSet对象在标准迭代方法或[]被调用时表现得像Arrays 。

在您的示例中,输出包含所有出现的:
   a 标记位于 h3 标记内,而 div 标记位于 div 标记内。(2次点击)

所以你可以:

output[0].attr('href')#=&gt; “http://www.faith.co.uk/”
output[1].attr('href')#=&gt; “http://www.hate.co.uk/”

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

Link说:Rodeo Sinclair
 Link说:Morvern

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

#=&gt; ['http://www.faith.co.uk/','http://www.hate.co.uk/']
等等...

去查看nokogiri.org以获取更多示例和深入解释。