我正在尝试学习红宝石,所以我正在关注谷歌开发。我正在尝试解析一些链接。在成功重定向的情况下(考虑到我知道它可能只被重定向一次),我得到重定向禁止。我注意到我从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
答案 0 :(得分:1)
Ruby的OpenURI会自动为您处理重定向,只要它们不是HTML本身内部的“meta-refresh”。
例如,这会自动进行重定向:
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响应类”部分。
使用案例陈述,您可以正确处理各种类型的答案:
def fetch(uri_str, limit = 10) # You should choose a better exception. raise ArgumentError, 'too many HTTP redirects' if limit == 0 response = Net::HTTP.get_response(URI(uri_str)) case response when Net::HTTPSuccess then response when Net::HTTPRedirection then location = response['location'] warn "redirected to #{location}" fetch(location, limit - 1) else response.value end end 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/
答案 1 :(得分:0)
您尝试打开的code.google中的网址基本上会重定向到https网址。如果您将http://code.google.com/edu/languages/google-python-class/images/puzzle/p-bija-baei.jpg
粘贴到浏览器中,则可以自行查看
检查以下bug report,解释为什么open-uri无法重定向到https;
所以问题的解决方案很简单:使用一组不同的网址(不会重定向到https)