我在这上面尝试了很多网址,看起来没问题,直到我遇到这个特殊的网址:
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 :(得分: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" => "foo@bar.invalid", "Referer" => "http://www.ruby-lang.org/") {|f| # ... }
答案 1 :(得分:5)
您可能需要通过&#39; User-Agent&#39;作为open方法的参数。有些网站需要有效的用户代理,否则他们根本不会回复或显示404未找到的错误。
doc = Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html", "User-Agent" => "MyCrawlerName (http://mycrawler-url.com)"))
答案 2 :(得分:2)
所以发生了什么,我该如何处理这种错误。
不知道发生了什么,但你可以通过捕捉错误来处理它。
begin
doc = Nokogiri::HTML(open("http://www.moxyst.com/fashion/men-clothing/underwear.html"))
puts doc
rescue => e
puts "I failed: #{e}"
end
我可以忽略它,让剩下的工作吗?
当然!也许?不确定。我们不了解您的要求。