使用nokogiri - 重定向异常通过open()解析html GET

时间:2013-02-27 17:56:57

标签: ruby parsing nokogiri

我正在尝试学习红宝石,所以我正在关注谷歌开发。我正在尝试解析一些链接。在成功重定向的情况下(考虑到我知道它可能只被重定向一次),我得到重定向禁止。我注意到我从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

2 个答案:

答案 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)