2012-02-10 4 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

答えて

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 ::ノードセット

Nokogir :: XML ::ノードセットは、クラス "のような配列" であるので、(それをシンプルに取って)あなたはNokogirを期待することができます:: XML :: NodeSetオブジェクトは、標準の反復メソッドまたは[]が呼び出されたときに配列のように動作します。

あなたの例では、出力が出現するすべての含まれています。
順番にのdivタグ内にあるH3タグ内にあるタグを(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を参照してください。

関連する問題