我正在尝试学习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
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文档。下面是如何从文档中执行此操作的示例:
重定向后<>之前语句解析:你应该选择一个更好的例外。如果limit == 0,则引发ArgumentError, '太多HTTP重定向'response = Net::HTTP.get_response(URI(uri_str))情况下的反应当Net::HTTPSuccess则响应当Net::HTTPRedirection然后Location = response[' Location ']警告"重定向到#{location}"Fetch (location, limit - 1)其他的response.value结束结束打印获取("http://www.ruby-lang.org")之前每个Net::HTTPResponse对象都属于对应其响应代码的一个类。
例如,所有2XX响应都是Net::HTTPSuccess子类的实例,3XX响应是Net::HTTPRedirection子类的实例,200响应是Net::HTTPOK类的实例。有关响应类的详细信息,请参见下面的"HTTP响应类"一节。使用case语句可以正确处理各种类型的响应:
如果你想处理meta-refresh语句,反思一下:
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/
基本上是代码中的url。谷歌,你试图打开重定向到一个HTTPS url。你可以自己看到如果你把http://code.google.com/edu/languages/google-python-class/images/puzzle/p-bija-baei.jpg
粘贴到浏览器中
检查下面的bug报告,它解释了为什么open-uri不能重定向到https;
所以你的问题的解决方案很简单:使用一组不同的url(不重定向到https)