2014-09-05 15 views
5

मैं इस पर बहुत से URL की कोशिश की से सामान्य रूप से उपयोग कर सकते हैं और वे जब तक मैं इस विशेष रूप से एक में आए ठीक होने लगते हैं:404 नहीं मिला है, लेकिन वेब ब्राउज़र

/Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:353:in `open_http': 404 Not Found (OpenURI::HTTPError) 
    from /Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:709:in `buffer_open' 
    from /Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:210:in `block in open_loop' 
    from /Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:208:in `catch' 
    from /Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:208:in `open_loop' 
    from /Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:149:in `open_uri' 
    from /Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:689:in `open' 
    from /Users/macbookair/.rvm/rubies/ruby-2.0.0-p481/lib/ruby/2.0.0/open-uri.rb:34:in `open' 
    from test.rb:5:in `<main>' 
:

require 'rubygems' 
require 'nokogiri' 
require 'open-uri' 

doc = Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html")) 
puts doc 

यह परिणाम है

मैं इसे किसी वेब ब्राउज़र से एक्सेस कर सकता हूं, मुझे बस यह बिल्कुल नहीं मिलता है।

क्या चल रहा है, और मैं इस तरह की त्रुटि से कैसे निपट सकता हूं? क्या मैं इसे अनदेखा कर सकता हूं और बाकी को अपना काम कर सकता हूं?

+0

आप रूबी 2+ का उपयोग कर रहे हैं, इसलिए 'आवश्यकता' rubygems 'का उपयोग करना आवश्यक नहीं है। रुबी 1.9 में यह आवश्यकता वापस गायब हो गई। –

उत्तर

5

आपको 404 Not Found (OpenURI::HTTPError) मिल रहा है, इसलिए, यदि आप अपने कोड को जारी रखने की अनुमति देना चाहते हैं, तो उस अपवाद के लिए बचाव करें। कुछ इस तरह काम करना चाहिए:

require 'nokogiri' 
require 'open-uri' 

URLS = %w[ 
    http://www.moxyst.com/fashion/men-clothing/underwear.html 
] 

URLs.each do |url| 
    begin 
    doc = Nokogiri::HTML(open(url)) 
    rescue OpenURI::HTTPError => e 
    puts "Can't access #{ url }" 
    puts e.message 
    puts 
    next 
    end 
    puts doc.to_html 
end 

आप अधिक सामान्य अपवाद उपयोग कर सकते हैं, लेकिन तब आप समस्याओं अजीब उत्पादन हो रही में चलाने या उन्हें इस तरह अधिक समस्याओं का कारण बनता में एक असंबंधित समस्या को संभाल सकता है, तो आप आंकड़ा करने की आवश्यकता होगी आपको आवश्यक ग्रैन्युलरिटी के बाहर।

आप या तो httpd हेडर, प्रतिक्रिया की स्थिति, या यहाँ तक सूंघ सकता अपवाद संदेश को देखने के यदि आप और नियंत्रण चाहते हैं और कुछ एक 401 या 404.

के लिए अलग करना चाहते हैं मैं इसे किसी वेब ब्राउज़र से एक्सेस कर सकता हूं, मुझे बस यह बिल्कुल नहीं मिला है।

ठीक है, यह सर्वर की तरफ कुछ हो रहा है: शायद वे UserAgent स्ट्रिंग को आप पसंद नहीं कर रहे हैं? OpenURI documentation दिखाता है कि उस हेडर को कैसे बदला जाए:

अतिरिक्त शीर्षलेख फ़ील्ड को वैकल्पिक हैश तर्क द्वारा निर्दिष्ट किया जा सकता है।

open("http://www.ruby-lang.org/en/", 
    "User-Agent" => "Ruby/#{RUBY_VERSION}", 
    "From" => "[email protected]", 
    "Referer" => "http://www.ruby-lang.org/") {|f| 
    # ... 
} 
2

तो क्या चल रहा है और मैं इस तरह की त्रुटि से कैसे निपट सकता हूं।

कोई संकेत नहीं है कि क्या हो रहा है, लेकिन आप त्रुटि को पकड़कर इसका सामना कर सकते हैं।

begin 
    doc = Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html")) 
    puts doc 
rescue => e 
    puts "I failed: #{e}" 
end 

मैं बस इसे अनदेखा और बाकी अपने काम करते हैं कर सकते हैं?

ज़रूर! शायद? निश्चित नहीं। हम आपकी आवश्यकताओं को नहीं जानते हैं।

5

आप विधि को खोलने के लिए पैरामीटर के रूप में 'उपयोगकर्ता-एजेंट' पारित करने के लिए आवश्यकता हो सकती है। कुछ साइटों को वैध उपयोगकर्ता-एजेंट की आवश्यकता होती है अन्यथा वे 404 त्रुटि नहीं मिली प्रतिक्रिया या प्रतिक्रिया नहीं देते हैं।

doc = Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html", "User-Agent" => "MyCrawlerName (http://mycrawler-url.com)")) 
+0

यह मेरी समस्या का हल हल! – daveomcd

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