【发布时间】:2012-11-06 19:33:39
【问题描述】:
我正在使用 Ruby 抓取有时会返回我想要关注的重定向的网页。 有很多 Ruby gem 可以做到这一点,但是有一个问题:
Ruby 的 URI.parse 会在一些技术上无效但在 "http://www.google.com/?q=<>" 等浏览器中工作的 URI 上爆炸
URI.parse("http://www.google.com/?q=<>") #=> error
require 'addressable/uri'
Addressable::URI.parse("http://www.google.com/?q=<>") #=> works
我尝试过的所有 HTTP 客户端库(HttParty、Faraday、RestClient)在重定向中遇到这样的 URI 时都会中断(这是在 ruby 1.9.3 上)
休息客户端:
require 'rest-client'
RestClient.get("http://bitly.com/ReeuYv") #=> explodes
法拉第:
require 'faraday'
require 'faraday_middleware'
Faraday.use(FaradayMiddleware::FollowRedirects)
Faraday.get("http://bitly.com/ReeuYv") #=> explodes
http派对:
require 'httparty'
HTTParty.get("http://bitly.com/ReeuYv") # => explodes
打开 uri:
require 'open-uri'
open("http://bitly.com/ReeuYv") # => explodes
我可以做些什么来完成这项工作?
【问题讨论】:
-
对于它的价值,
URI.parse在这种情况下实际上只是符合 RFC 3986 -<和>应该是 URL 编码的。浏览器更宽容。 -
包含原始
<>的URI 是有效的假设是不正确的。 -
好的。但是,如果这可行,那就太好了。 (更正了问题)
-
一个像浏览器地址栏一样宽容的简单 http gem 将是一件好事 - 在许多情况下,url 处理与人们过去习惯的内容相匹配是有效的一天的网络使用量。
标签: ruby-on-rails ruby httparty rest-client faraday