2014-09-05 1 views
5

Я попытался множество ссылок на это, и они, кажется, хорошо, пока я не наткнулся этой конкретной один:404 не найдено, но доступ обычно из веб-браузера

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

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

Это результат:

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

Я могу получить доступ к этому из веб-браузера, я просто не понимаю его.

Что происходит, и как я могу справиться с такой ошибкой? Могу ли я игнорировать его и позволить остальным выполнять свою работу?

+0

Вы используете Ruby 2+, поэтому нет необходимости использовать 'require 'rubygems''. Это требование исчезло в Ruby 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

Вам может понадобиться передать 'User-Agent' в качестве параметра, чтобы открыть метод. Некоторые сайты требуют действительного User-Agent, иначе они просто не отвечают или не показывают ошибку 404, не найденную.

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

Это решило мою проблему благодаря! – daveomcd