5

OpenURI::HTTPError: 403 Forbidden当我尝试open使用逗号(或其他特殊字符,如.)的 URL 时,我遇到了错误。我可以在浏览器中打开相同的网址。

require 'open-uri'
url = "http://en.wikipedia.org/wiki/Thor_Industries,_Inc."
f = open(url)
# throws OpenURI::HTTPError: 403 Forbidden error

如何转义这样的 URL?

我试图用 url 转义CGI::escape,我得到了同样的错误。

f = open(CGI::escape(url))
4

1 回答 1

7

通常,人们会简单地 require 模块cgi,然后使用CGI::escape(str).

require 'cgi'
require 'open-uri'
escaped_page = CGI::escape("Thor_Industries,_Inc.")
url = "http://en.wikipedia.org/wiki/#{escaped_page}"
f = open(url)

但是,这似乎不适用于您的特定实例,并且仍然返回 403。无论如何,我将把它留在这里以供参考。


编辑:维基百科拒绝您的请求,因为它怀疑您是机器人。似乎某些明确内容的页面已授予您,但那些与其“安全”模式不匹配的页面(例如包含点或逗号的页面)将受到其筛选。如果您实际输出内容(我使用 执行此操作Net::HTTP),您将获得以下信息:

脚本应使用包含联系信息的用户代理字符串,否则它们可能会被 IP 阻止,恕不另行通知。

但是,提供用户代理字符串可以解决问题:

open("http://en.wikipedia.org/wiki/Thor_Industries,_Inc.",
  "User-Agent" => "Ruby/#{RUBY_VERSION}")
于 2010-03-01T21:30:56.363 回答