0

我正在尝试学习 ruby​​,所以我正在关注 google dev 的练习。我正在尝试解析一些链接。在成功重定向的情况下(考虑到我知道它只能被重定向一次),我被禁止重定向。我注意到我从 http 协议链接转到 https 协议链接。任何具体的想法我怎么能在 ruby​​ 中实现这个,因为谷歌的练习是针对 python 的?

错误:

ruby fix.rb
redirection forbidden: http://code.google.com/edu/languages/google-python-class/images/puzzle/p-bija-baei.jpg -> https://developers.google.com/edu/python/images/puzzle/p-bija-baei.jpg?csw=1

应该实现我正在寻找的代码:

def acquireData(urls, imgs) #List item urls list of valid urls !checked, imgs list of the imgs I'll download afterwards.
  begin
    urls.each do |url|
      page = Nokogiri::HTML(open(url))
      puts page.body
    end
  rescue Exception => e
    puts e
  end
end
4

2 回答 2

1

Ruby 的OpenURI会自动为您处理重定向,只要它们不是发生在 HTML 内部的“元刷新”。

例如,这会自动遵循重定向:

irb(main):008:0> page = open('http://www.example.org')
#<StringIO:0x00000002ae2de0>
irb(main):009:0> page.base_uri.to_s
"http://www.iana.org/domains/example"

换句话说,对“www.example.org”的请求被重定向到“www.iana.org”,OpenURI 正确地跟踪了它。

如果您正在尝试学习如何处理重定向,请阅读Net::HTTP文档。以下是如何从文档中执行此操作的示例:

跟随重定向

每个 Net::HTTPResponse 对象都属于其响应代码的一个类。

例如,所有 2XX 响应都是 Net::HTTPSuccess 子类的实例,3XX 响应是 Net::HTTPRedirection 子类的实例,而 200 响应是 Net::HTTPOK 类的实例。有关响应类的详细信息,请参阅下面的“HTTP 响应类”部分。

使用 case 语句,您可以正确处理各种类型的响应:

def fetch(uri_str, limit = 10)
  # 你应该选择一个更好的例外。
  引发 ArgumentError, 'too many HTTP redirects' if limit == 0

  response = Net::HTTP.get_response(URI(uri_str))

  个案回应
  当 Net::HTTPS 成功时
    回复
  当 Net::HTTPRedirection 然后
    位置=响应['位置']
    警告“重定向到 #{location}”
    获取(位置,限制 - 1)
  别的
    响应值
  结尾
结尾

print fetch('http://www.ruby-lang.org')

如果要处理元刷新语句,请考虑以下内容:

require 'nokogiri'

doc = Nokogiri::HTML(%[<meta http-equiv="refresh" content="5;URL='http://example.com/'">])
meta_refresh = doc.at('meta[http-equiv="refresh"]')
if meta_refresh
  puts meta_refresh['content'][/URL=(.+)/, 1].gsub(/['"]/, '')
end

哪个输出:

http://example.com/
于 2013-02-27T18:55:04.357 回答
0

基本上,您尝试打开的 code.google 中的 url 重定向到 https url。http://code.google.com/edu/languages/google-python-class/images/puzzle/p-bija-baei.jpg如果您粘贴到浏览器中,您可以自己查看

检查以下错误报告,该报告解释了为什么 open-uri 无法重定向到 https;

So the solution to your problem is simply: use a different set of urls (that don't redirect to https)

于 2013-02-27T19:00:13.437 回答