2014-09-05 13 views
5

ho provato molti URL su questo e sembrano andare bene fino a quando mi sono imbattuto in questo particolare uno:404 non trovato, ma possono accedere normalmente da browser web

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

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

questo è il risultato:

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

Posso accedervi da un browser web, proprio non capisco affatto.

Cosa sta succedendo e come posso risolvere questo tipo di errore? Posso ignorarlo e lasciare che il resto faccia il loro lavoro?

+0

Stai usando Ruby 2+ quindi non è necessario usare 'require 'rubygems''. Questo requisito è scomparso in Ruby 1.9. –

risposta

5

Stai ricevendo 404 Not Found (OpenURI::HTTPError), quindi, se vuoi consentire al tuo codice di continuare, salva questa eccezione. Qualcosa del genere dovrebbe funzionare:

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 

È possibile utilizzare le eccezioni più generiche, ma poi si incorrere in problemi per ottenere l'uscita di strano o potrebbe gestire un problema non correlato in un modo che causa più problemi, quindi avrai bisogno di figura la granularità di cui hai bisogno.

Si potrebbe anche annusare sia le intestazioni httpd, lo stato della risposta, o guardare il messaggio di eccezione, se si desidera ancora di più il controllo e si vuole fare qualcosa di diverso per un 401 o un 404.

Posso accedervi da un browser web, semplicemente non capisco affatto.

Beh, potrebbe succedere qualcosa sul lato server: Forse non gli piace la stringa UserAgent che stai inviando? Il OpenURI documentation mostra come modificare quell'intestazione:

Ulteriori campi di intestazione possono essere specificati da un argomento di hash facoltativo.

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

Quindi cosa sta succedendo e come posso affrontare questo tipo di errore.

Nessun indizio su cosa sta succedendo, ma è possibile gestirlo recuperando l'errore.

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

Posso semplicemente ignorarlo e lasciare che il resto fare il loro lavoro?

Sicuro! Può essere? Non sono sicuro. Non conosciamo le tue esigenze.

5

Potrebbe essere necessario passare 'User-Agent' come parametro per il metodo aprire. Alcuni siti richiedono un agente utente valido, altrimenti semplicemente non rispondono o mostrano un errore 404 non trovato.

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

Questo ha risolto il mio problema grazie! – daveomcd

Problemi correlati