2012-02-17 7 views

答えて

14

を返したい

<html> 
    <body> 
     <a href=#foo>Foo</a> 
     <a href=#bar>Bar </a> 
    </body> 
</html> 

はここでワンライナーです:

間違いなく読みやすくするためにビットを分割
Hash[doc.xpath('//a[@href]').map {|link| [link.text.strip, link["href"]]}] 

#=> {"Foo"=>"#foo", "Bar"=>"#bar"} 

h = {} 
doc.xpath('//a[@href]').each do |link| 
    h[link.text.strip] = link['href'] 
end 
puts h 

#=> {"Foo"=>"#foo", "Bar"=>"#bar"} 
+0

をおかげで、完全に働きました。 – sunnyrjuneja

+0

あなたは[link ['href'] '](http://nokogiri.org/Nokogiri/XML/Node.html#method-i-5B)だけで' link.attributes ['href']。valueを置き換えることができます-5D)。 – Phrogz

+0

@Phrogzありがとう!更新しました。 –

2

別way:

h = doc.css('a[href]').each_with_object({}) { |n, h| h[n.text.strip] = n['href'] } 
# yields {"Foo"=>"#foo", "Bar"=>"#bar"} 

そして、あなたはあなたが別のものへのリンクと同じテキストを持っているかもしれないと心配しているならば、あなたは配列内のhrefの収集:

h = doc.css('a[href]').each_with_object(Hash.new { |h,k| h[k] = [ ]}) { |n, h| h[n.text.strip] << n['href'] } 
# yields {"Foo"=>["#foo"], "Bar"=>["#bar"]} 
+0

'a'タグの問題は、名前付きアンカーのようなリンクや非リンクに使用できることです。 'href'属性の有無をチェックする必要があります。 –

+0

@マーク:私は 'a [href]'に切り替えたと思うのですが、その理由のためだけにコメントしています。 –

+0

ありがとう、完璧に働いた。 – sunnyrjuneja

関連する問題