2012-02-10 43 views
1

这是我正在扫描的HTML的一个示例。如何用Nokogiri抓取多个模式的实例?

<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。我如何获得这两个?

+0

如果存在该模式的多个实例(在您的情况下为'div h3 a'),那么'css'应该返回一个'NodeSet',您可以遍历它。 – itdoesntwork 2012-02-10 13:49:47

回答

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

您可以使用类似map捕捉到所有节点。

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

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

Nokogir :: XML ::节点集是一个 “阵列像” 类,所以(把它简单),你可以期望Nokogir :: XML NodeSet对象在调用标准迭代方法或[]时会表现得像Arrays一样。

在您的示例输出包含的所有出现:
一个标签是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 ''
等等......

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

相关问题