2012-02-17 6 views
5

मैं पेज पर सभी यूआरएल निकालने के लिए नॉकोगिरी मणि का उपयोग करने की कोशिश कर रहा हूं, साथ ही उनके लिंक टेक्स्ट और एक हैश में लिंक टेक्स्ट और यूआरएल स्टोर करता हूं।नॉकोगिरी और रूबी के साथ एचटीएमएल दस्तावेज़ से लिंक और href टेक्स्ट प्राप्त करें?

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

मैं

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

उत्तर

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

+0

आप 'link.attributes ['href'] को बदल सकते हैं। मूल्य 'केवल [' link [' href '] '] (http://nokogiri.org/Nokogiri/XML/Node.html#method-i-5B -5D)। – Phrogz

+0

@Phrogz धन्यवाद! अपडेट किया गया। –

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

'ए' टैग के साथ समस्या यह है कि इसका उपयोग लिंक और नामांकित एंकर जैसे गैर-लिंक के लिए किया जा सकता है। आपको 'href' विशेषता की उपस्थिति की जांच करनी है। –

+0

@ मार्क: मुझे लगता है कि मैं उस कारण के लिए टिप्पणी कर रहा था, जबकि मैं '[href] 'पर स्विच किया था। –

+0

धन्यवाद, पूरी तरह से काम किया। – sunnyrjuneja

संबंधित मुद्दे