2014-09-05 5 views
5

ich auf diesem viele URLs versucht, und sie scheinen in Ordnung zu sein, bis ich auf diesem bestimmten kam:404 nicht gefunden, aber kann in der Regel von Web-Browser zugreifen

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

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

Dies ist das Ergebnis:

/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>' 

Ich kann darauf von einem Webbrowser zugreifen, ich verstehe es einfach nicht.

Was ist los und wie kann ich mit dieser Art von Fehler umgehen? Kann ich es ignorieren und den Rest erledigen lassen?

+0

Sie verwenden Ruby 2+, es ist also nicht notwendig 'require 'rubygems'' zu verwenden. Diese Anforderung ist in Ruby 1.9 wieder verschwunden. –

Antwort

5

Sie erhalten 404 Not Found (OpenURI::HTTPError), also, wenn Sie Ihren Code fortsetzen möchten, retten Sie für diese Ausnahme. So etwas sollte funktionieren:

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 

Sie können generische Ausnahmen verwenden, aber dann laufen Sie Probleme seltsame Ausgang bekommen oder vielleicht ein nicht verwandtes Problem in einer Weise behandeln, die mehr Probleme verursacht, so dass Sie zu Figur brauchen aus der Granularität, die Sie brauchen.

Sie könnten schnüffeln auch entweder die httpd-Header, um den Status der Antwort, oder auf der Ausnahmemeldung aussehen, wenn Sie noch mehr Kontrolle und wollen etwas anderes für ein 401 oder ein 404.

tun Ich kann von einem Webbrowser darauf zugreifen, ich verstehe es einfach nicht.

Nun, das könnte etwas auf der Server-Seite passieren: Vielleicht mögen sie nicht die UserAgent-Zeichenfolge, die Sie senden? Die OpenURI documentation zeigt, wie dieser Header geändert wird:

Zusätzliche Headerfelder können durch ein optionales Hash-Argument angegeben werden.

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

Also was ist los und wie kann ich mit dieser Art von Fehler umgehen.

Keine Ahnung, was passiert, aber Sie können damit umgehen, indem Sie den Fehler abfangen.

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

Kann ich ignoriere es einfach und lassen Sie den Rest ihre Arbeit tun?

Sicher! Könnte sein? Nicht sicher. Wir kennen Ihre Anforderungen nicht.

5

Möglicherweise müssen Sie zu 'User-Agent' als Parameter übergeben Methode zu öffnen. Einige Sites benötigen einen gültigen User-Agent, andernfalls antworten sie einfach nicht oder zeigen einen Fehler 404 nicht gefunden an.

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

Das hat mein Problem gelöst, danke! – daveomcd