open-uri 的 open 方法获取 url 时报错,查明原因是此页面无权访问或不存在然后重定向上其它页面了,然后程序无法继续,google 一下,都 是说 open-uri 里面的 open 方法会自动对 302 redirection 重定向地址进行追踪访问,然后再也没有详细信息了……求高手能给一些提示
可以使用Faraday,然后根据 Response 的 Status 来判断、处理
Faraday.get('http://ruby-china.org/topics/9738')
你要把具体的出错信息贴出来。
open
默认是支持 302 转向的。如果转向抛异常,一般是转向后的协议不一致造成的,如访问的是 http 而转向的是 https。
访问 URL 需要较高的容错,你应该在 open
方法外捕获异常。
如楼上,这个访问有各类问题,一定要做较高的容错处理。 faraday 不错,要轻松点可以试 httparty。直接用 open-uri 能了解不少东西,但是要花点力气。
response = Faraday.get('http://ruby-china.org/topics/9738')
case response.status
when 200
@html = response.body
when 301..302
@html = Faraday.get(response[:Location])
end
doc = Nokogiri::HTML(@html)
url = open('http://****')
doc = Nokogiri::HTML(url)
错误信息如下(是在 open(***) 这里报的错):
OpenURI::HTTPError: 404 Not Found
from /home/cv-tian/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/open-uri.rb:346:in open_http'
from /home/cv-tian/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/open-uri.rb:775:in
buffer_open'
from /home/cv-tian/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/open-uri.rb:203:in block in open_loop'
from /home/cv-tian/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/open-uri.rb:201:in
catch'
from /home/cv-tian/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/open-uri.rb:201:in open_loop'
from /home/cv-tian/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/open-uri.rb:146:in
open_uri'
from /home/cv-tian/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/open-uri.rb:677:in open'
from /home/cv-tian/.rvm/rubies/ruby-1.9.3-p125/lib/ruby/1.9.1/open-uri.rb:33:in
open'
from (irb):323
from /home/cv-tian/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `
应该怎么判断才能避免出错信息?
扑捉错误,就是获取到 OpenURI 的异常的对象
https://github.com/ruby/ruby/blob/trunk/lib/open-uri.rb#L357
https://www.google.com/search?q=ruby+begin+rescue
begin
....
rescue OpenURI::HTTPError
....
end
看到这个帖子了就顺手回一下,下面代码应该是楼主要的东西,当 open 出现异常时,打印出异常信息,如果 open 正常则返回 url。
require "open-uri"
require "timeout"
uri = "http://www.ooxxbaidu.com"
begin
req = open(uri).read
rescue StandardError,Timeout::Error, SystemCallError, Errno::ECONNREFUSED
puts $!
else
puts uri
end