2012-05-08 24 views
6

में अपनी स्थिति के आधार पर लिंक का संग्रह वापस करने के लिए मैकेनाइज मणि का उपयोग करके मैं मशीनीकरण के साथ संघर्ष कर रहा हूं। मैं लिंक के एक सेट पर "क्लिक" करना चाहता हूं जिसे केवल उनकी स्थिति (div # सामग्री के भीतर सभी लिंक) या उनके href द्वारा पहचाना जा सकता है।डीओएम

मैंने बिना सफलता के इन दोनों पहचान विधियों को आजमाया है।

प्रलेखन से, मैं यह नहीं समझ सकता कि डीओएम में उनकी स्थिति के आधार पर लिंक का संग्रह (क्लिक करने के लिए) कैसे लौटाता है, न कि सीधे लिंक पर विशेषताओं द्वारा।

दूसरे, documentation सुझाव आप उपयोग कर सकते हैं: href एक आंशिक href मिलान करने के लिए,

page = agent.get('http://foo.com/').links_with(:href => "/something") 

लेकिन एक ही तरीका है कि मैं इसे एक लिंक वापस जाने के लिए मिल सकता है एक पूरी तरह से योग्य यूआरएल पास करके, जैसे

है
page = agent.get('http://foo.com/').links_with(:href => "http://foo.com/something/a") 

यह बहुत उपयोगी नहीं है अगर मैं href के

http://foo.com/something/a 
http://foo.com/something/b 
http://foo.com/something/c 
etc... 
के साथ लिंक का एक संग्रह लौटना चाहते

क्या मैं कुछ गलत कर रहा हूँ? क्या मेरे पास अवास्तविक उम्मीदें हैं?

उत्तर

8

भाग II वह मान जो आप पास करते हैं: href को डिफ़ॉल्ट रूप से सटीक मिलान होना चाहिए। तो आपके उदाहरण में href केवल <a href="/something"></a> से मेल खाता है और <a href="foo.com/something/a"></a>

आप जो करना चाहते हैं वह रेगेक्स में पास करना है ताकि यह href फ़ील्ड के भीतर एक सबस्ट्रिंग से मेल खा सके। इसलिए जैसा:

page = agent.get('http://foo.com/').links_with(:href => %r{/something/}) 

संपादित करें: भाग ताकि इसे, केवल एक लिंक में लिंक चुनने के लिए अपने स्ट्रिंग में एक nokogiri शैली खोज विधि जोड़ पाने के लिए। इस तरह:

page = agent.get('http://foo.com/').search("div#content").links_with(:href => %r{/something/}) # ** 

ठीक है, कि आप page = agent.get('http://foo.com/').search("div#content") करते हैं, क्योंकि के बाद काम नहीं करता है आप एक Nokogiri एक मशीनीकरण एक के बजाय वापस आपत्ति हो, तो links_with काम नहीं करेगा। हालांकि आप सीएसएस विधि का उपयोग कर नोकोगिरी ऑब्जेक्ट से लिंक निकालने में सक्षम होंगे। मैं की तरह कुछ सुझाव है:

page = agent.get('http://foo.com/').search("div#content").css("a")

यदि वह काम नहीं करता है, मैं बाहर http://nokogiri.org/tutorials

+2

इस बिंदु पर मशीनीकरण पर प्रलेखन में सुधार किया जा सकता है। – vlasits

+0

धन्यवाद, क्या आपको अपने प्रश्न के दूसरे भाग के बारे में कोई जानकारी है, उनके डीओएम स्थिति के आधार पर लिंक लौटने पर? – pingu

+0

मैंने प्रश्न के दोनों हिस्सों के उत्तर देने के लिए ऊपर संपादित किया। – vlasits

2

वें लिंक देखने का सुझाव देते हैं:

page.links[n-1] 

पहले 5 लिंक:

page.links[0..4] 

href में 'कुछ' के साथ लिंक:

page.links_with :href => /something/ 
1

आप नोकोगिरी नोड्स का उपयोग करके मशीनीकरण लिंक प्राप्त कर सकते हैं।source code of links() method.

# File lib/mechanize/page.rb, line 352 
def links 
    @links ||= %w{ a area }.map do |tag| 
    search(tag).map do |node| 
     Link.new(node, @mech, self) 
    end 
    end.flatten 
end 

तो इसका मतलब है कि देखें:

the_links= page.search("valid_selector") do |nl| 
    Mechanize::Page::Link.new(nl, agent, page) 
end 

यह आपको उपयोगी href, पाठ और uri तरीकों दे देंगे।

+0

नोकोगिरी :: सीएसएस :: सिंटेक्स त्रुटि: अनपेक्षित '@href' के बाद '[# <नोकोगिरी :: सीएसएस :: नोड: –

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