Ruby open-uri 的 open 方法获取 url 时报错

tianshuai · 2013年03月25日 · 最后由 xazaj 回复于 2013年05月30日 · 8747 次阅读

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 能了解不少东西,但是要花点力气。

#1 楼 @yangkit 我试了这个插件,可以自动处理重定向页面的请求,也正常返回状态码信息和重定向的页面链接,但是我也用到了 nokogiri,doc = Nokogiri::HTML(open('http://*****')),发现 nokogriri 不支持 Faradaydoc = Nokogiri::HTML(Faraday.get('http://***')),只能先判断 Faraday 解析后的页面状态码,如果是 302 再用 open-uri 的 open 方法去解析这个转向的链接,是可以实现我想要的,觉得复杂了

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)

@tianshuai

#2 楼 @ashchan 这是我的代码:

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:inbuffer_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:incatch' 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:inopen_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:inopen' from (irb):323 from /home/cv-tian/.rvm/rubies/ruby-1.9.3-p125/bin/irb:16:in `

'

应该怎么判断才能避免出错信息?

#5 楼 @yangkit 谢谢 yangkit,没想到把代码已经详细帖出来了,本人对 open-uri 算是接触不多,没想到 ruby 处理 http 比自己想象的复杂的多,就像 @as181920 说的一定要做较高的容错处理,确实这样,继续学习……

404 错误呀。

#7 楼 @tianshuai 网络连接方面的异常主要包括ConnectionFailedTimeoutError等,其他视应用而定

#8 楼 @metal 404 也是链接地址有误网站重定向过去的,就是想不报错误而是返回一个信息

#10 楼 @tianshuai

扑捉错误,就是获取到 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
需要 登录 后方可回复, 如果你还没有账号请 注册新账号