2012-02-17 133 views

回答

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"} 
+0

谢谢,非常完美。 – sunnyrjuneja 2012-02-18 00:07:01

+0

你可以用''link ['href']']替换'link.attributes ['href'] .value'(http://nokogiri.org/Nokogiri/XML/Node.html#method-i-5B -5D)。 – Phrogz 2012-02-18 00:10:03

+0

@Progrog谢谢!更新。 – 2012-02-18 03:16:10

2

另一个方式:

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"]} 
+0

“a”标签的问题是它可以用于链接和非链接,如命名锚。你必须检查是否存在'href'属性。 – 2012-02-17 22:41:13

+0

@Mark:我想我在为此评论时切换到了“[href]”。 – 2012-02-17 23:02:55

+0

谢谢,工作完美。 – sunnyrjuneja 2012-02-18 00:06:43