私はnokogiri gemを使用してページ上のすべてのURLとそのリンクテキストを抽出し、リンクテキストとURLをハッシュに格納しようとしています。私はNokogiri&Rubyとのhtml docからのリンクとhrefテキストを取得しますか?
{"Foo" => "#foo", "Bar" => "#bar"}
私はnokogiri gemを使用してページ上のすべてのURLとそのリンクテキストを抽出し、リンクテキストとURLをハッシュに格納しようとしています。私はNokogiri&Rubyとのhtml docからのリンクとhrefテキストを取得しますか?
{"Foo" => "#foo", "Bar" => "#bar"}
を返したい
<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"}
別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"]}
'a'タグの問題は、名前付きアンカーのようなリンクや非リンクに使用できることです。 'href'属性の有無をチェックする必要があります。 –
@マーク:私は 'a [href]'に切り替えたと思うのですが、その理由のためだけにコメントしています。 –
ありがとう、完璧に働いた。 – sunnyrjuneja
をおかげで、完全に働きました。 – sunnyrjuneja
あなたは[link ['href'] '](http://nokogiri.org/Nokogiri/XML/Node.html#method-i-5B)だけで' link.attributes ['href']。valueを置き換えることができます-5D)。 – Phrogz
@Phrogzありがとう!更新しました。 –