我正在嘗試使用nokogiri gem來提取網頁上的所有網址以及它們的鏈接文本,並將鏈接文本和網址存儲在哈希中。從Nokogiri&Ruby的html文檔獲取鏈接和href文本?
<html>
<body>
<a href=#foo>Foo</a>
<a href=#bar>Bar </a>
</body>
</html>
我想回
{"Foo" => "#foo", "Bar" => "#bar"}
我正在嘗試使用nokogiri gem來提取網頁上的所有網址以及它們的鏈接文本,並將鏈接文本和網址存儲在哈希中。從Nokogiri&Ruby的html文檔獲取鏈接和href文本?
<html>
<body>
<a href=#foo>Foo</a>
<a href=#bar>Bar </a>
</body>
</html>
我想回
{"Foo" => "#foo", "Bar" => "#bar"}
這裏是一個班輪:
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"}
另一個方式:
h = doc.css('a[href]').each_with_object({}) { |n, h| h[n.text.strip] = n['href'] }
# yields {"Foo"=>"#foo", "Bar"=>"#bar"}
如果你擔心你可能有相同的文字鏈接到不同的東西,那麼你收集href
S IN陣列:
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'屬性。 – 2012-02-17 22:41:13
@Mark:我想我在爲此評論時切換到了「[href]」。 – 2012-02-17 23:02:55
謝謝,工作完美。 – sunnyrjuneja 2012-02-18 00:06:43
謝謝,非常完美。 – sunnyrjuneja 2012-02-18 00:07:01
你可以用''link ['href']']替換'link.attributes ['href'] .value'(http://nokogiri.org/Nokogiri/XML/Node.html#method-i-5B -5D)。 – Phrogz 2012-02-18 00:10:03
@Progrog謝謝!更新。 – 2012-02-18 03:16:10