2011-02-15 10 views
5

मुझे मैकेनाइजेशन के साथ थोड़ा परेशानी है।मशीनीकरण - रेलवे में मेटा रीफ्रेश का पालन कैसे करें या "क्लिक करें"

जब मैकेनाइजेशन के साथ एक फॉर्म सबमिट करते हैं। मैं एक मेटा रीफ्रेश के साथ एक पृष्ठ पर आया हूं और कोई लिंक नहीं है।

मेरा सवाल है कि मैं मेटा रीफ्रेश का पालन कैसे करूं?

मैंने मेटा रीफ्रेश की अनुमति देने का प्रयास किया है, लेकिन फिर मुझे सॉकेट त्रुटि मिलती है। नमूना कोड

require 'mechanize' 
agent = WWW::Mechanize.new 
agent.get("http://euroads.dk") 
form = agent.page.forms.first 
form.username = "username" 
form.password = "password" 
form.submit 
page = agent.get("http://www.euroads.dk/system/index.php?showpage=login") 
agent.page.body 

प्रतिक्रिया:

<html> 
<head> 
    <META HTTP-EQUIV=\"Refresh\" CONTENT=\"0;URL=index.php?showpage=m_frontpage\"> 
</head> 
</html> 

तो मैं कोशिश:

redirect_url = page.parser.at('META[HTTP-EQUIV=\"Refresh\"]')[ 
    "0;URL=index.php?showpage=m_frontpage\"][/url=(.+)/, 1] 

लेकिन मैं मिलता है:

 
NoMethodError: Undefined method '[]' for nil:NilClass 
+0

यह कोड की एक बुनियादी उदाहरण शामिल करने के लिए उपयोग कर रहे हैं और URL को जब आप तक पहुँच रहे हैं वास्तव में महत्वपूर्ण है प्रश्न पूछें। –

उत्तर

4

आंतरिक रूप से, Mechanize एचटीएमएल में एक डीओएम में पार्सिंग को संभालने के लिए Nokogiri का उपयोग करता है। आप नोकोगिरी दस्तावेज पर जा सकते हैं ताकि आप या तो लौटा पृष्ठ में चारों ओर खोदने के लिए XPath या CSS एक्सेसर्स का उपयोग कर सकें।

इस तरह केवल Nokogiri के साथ रीडायरेक्ट URL प्राप्त करने के लिए है:

require 'nokogiri' 

html = <<EOT 
<html> 
    <head> 
    <meta http-equiv="refresh" content="2;url=http://www.example.com/"> 
    </meta> 
    </head> 
    <body> 
    foo 
    </body> 
</html> 
EOT 

doc = Nokogiri::HTML(html) 
redirect_url = doc.at('meta[http-equiv="refresh"]')['content'][/url=(.+)/, 1] 
redirect_url # => "http://www.example.com/" 

doc.at('meta[http-equiv="refresh"]')['content'][/url=(.+)/, 1] टूट जाता है करने के लिए नीचे: refresh के http-equiv विशेषता के साथ <meta> टैग के लिए सीएसएस एक्सेसर की पहली आवृत्ति (at) का पता लगाएं। उस टैग की content विशेषता लें और url= के बाद स्ट्रिंग वापस करें।

यह एक सामान्य उपयोग के लिए कुछ मशीनीकरण कोड है। क्योंकि आप आप पर आधार मेरा करने के लिए कोई नमूना कोड दे दी है इस से काम करना होगा:

agent = Mechanize.new 
page = agent.get('http://www.examples.com/') 
redirect_url = page.parser.at('meta[http-equiv="refresh"]')['content'][/url=(.+)/, 1] 
page = agent.get(redirect_url) 

संपादित करें: at('META[HTTP-EQUIV=\"Refresh\"]')

आपका कोड ऊपर at() है। ध्यान दें कि आप एकल-उद्धृत स्ट्रिंग के अंदर डबल-कोट्स से बच रहे हैं। इसके परिणामस्वरूप बैकस्लैश होता है जिसके बाद स्ट्रिंग में डबल-कोट होता है जो मेरा नमूना उपयोग नहीं करता है, और यह मेरा पहला अनुमान है कि आपको त्रुटि क्यों मिल रही है। नोकोगिरी टैग नहीं ढूंढ सकता क्योंकि <meta http-equiv=\"Refresh\"...> नहीं है।

संपादित करें:

agent.follow_meta_refresh = true 

यह भी parse the meta tag के लिए एक विधि है और सामग्री वापस: मशीनीकरण निर्मित एक तरह से सेट करके मेटा-ताज़ा, संभाल करने के लिए है। डॉक्स से:

पार्स (सामग्री, uri)

एक मेटा टैग की सामग्री की विशेषता में विलंब और यूआरएल पार्स करता है। जब कोई यूआरएल निर्दिष्ट नहीं किया जाता है तो पार्स को वर्तमान पृष्ठ की यूरी को यूआरएल का अनुमान लगाने की आवश्यकता होती है। यदि कोई ब्लॉक दिया जाता है, तो आगे की प्रक्रिया के लिए पार्स विलंब और यूआरएल पास किया जाएगा। देरी और यूआरएल को पार्स नहीं किया जा सकता है।

# <meta http-equiv="refresh" content="5;url=http://example.com/" /> 
uri = URI.parse('http://current.com/') 

Meta.parse("5;url=http://example.com/", uri) # => ['5', 'http://example.com/'] 
Meta.parse("5;url=", uri)      # => ['5', 'http://current.com/'] 
Meta.parse("5", uri)       # => ['5', 'http://current.com/'] 
Meta.parse("invalid content", uri)   # => nil 
+0

आपके उत्तर के लिए धन्यवाद। मैंने अब कुछ नमूना कोड पोस्ट किया है क्योंकि मुझे एक त्रुटि मिलती है। अगली बार मैं शुरुआत में नमूना कोड पोस्ट करना याद रखूंगा। –

+0

@ रेल शुरुआती मेरे उत्तर में जोड़े गए संपादन को देखें। –

+0

@ रेल शुरुआती, मैंने एक और संपादन जोड़ा जो आपको शायद दिलचस्प लगेगा। –