我正在尝试使用nokogiri gem来提取页面上的所有网址以及链接文本,并将链接文本和网址存储在哈希中。
<html>
<body>
<a href=#foo>Foo</a>
<a href=#bar>Bar </a>
</body>
</html>
我想返回
{"Foo" => "#foo", "Bar" => "#bar"}
答案 0 :(得分:14)
这是一个单行:
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"}
答案 1 :(得分:2)
另一种方式:
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"]}