Ruby 的 HTTP 客户端不正确地解析某些 URL
Ruby's HTTP Client improperly parsing certain URLs
下面的问题很有可能有答案,但如果有,我就认不出来了。
事情是这样的:我正在制作一个 ruby 程序,该程序正在扫描字典以获取所有条目的列表。我需要它,因为我想扫描每个条目以搜索特定的单词,但这不是重点。问题是我的程序无法从某些编码的 links 下载数据,这在以前从未发生过。
通过编码,我的意思是编码替换非 ASCII 字符等,因此 link 像这样:
http://www.dict.cc/deutsch-englisch/a+%5Bauch+A%5D+%5BBuchstabe%5D.html
看起来像这样:
http://www.dict.cc/deutsch-englisch/a+%5Bauch+A%5D+%5BBuchstabe%5D.html
有趣的是,虽然上面的方法不起作用,但 link 中的大部分都起作用,例如:
/deutsch-englisch/A+an+B+anpassen.html
我测试了随机 links,它们都有效,我的正则表达式匹配它应该匹配的内容。
这是我正在使用的函数:
def getDataOverHttpGet(link, proxy = nil)
link = URI.unescape(link) # added only now
http = HTTPClient.new(:agent_name => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/25.0')
http.proxy = proxy if proxy
r = http.get(link)
raise r.status.to_s if r.status != 200
return r.body
end
到目前为止效果很好。有人向我建议 URL 可能会被 http 客户端转义,所以我添加了 unescape 东西。我在 return 中得到的是一个空字符串,而不是我的程序为缺失数据生成的信息(= 使用正则表达式的匹配失败)。但是,使用 URI.escape 没有任何改变,所以可能就是这样。但是,我不知道还能尝试什么。
此外,我程序中的所有字符串始终采用 UTF-8(无 BOM)格式。
尝试用 URI.parse 调用它,像这样:
http = HTTPClient.new(:agent_name => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/25.0')
http.proxy = proxy if proxy
r = http.get(URI.parse(link))
下面的问题很有可能有答案,但如果有,我就认不出来了。
事情是这样的:我正在制作一个 ruby 程序,该程序正在扫描字典以获取所有条目的列表。我需要它,因为我想扫描每个条目以搜索特定的单词,但这不是重点。问题是我的程序无法从某些编码的 links 下载数据,这在以前从未发生过。
通过编码,我的意思是编码替换非 ASCII 字符等,因此 link 像这样: http://www.dict.cc/deutsch-englisch/a+%5Bauch+A%5D+%5BBuchstabe%5D.html 看起来像这样: http://www.dict.cc/deutsch-englisch/a+%5Bauch+A%5D+%5BBuchstabe%5D.html
有趣的是,虽然上面的方法不起作用,但 link 中的大部分都起作用,例如: /deutsch-englisch/A+an+B+anpassen.html
我测试了随机 links,它们都有效,我的正则表达式匹配它应该匹配的内容。
这是我正在使用的函数:
def getDataOverHttpGet(link, proxy = nil)
link = URI.unescape(link) # added only now
http = HTTPClient.new(:agent_name => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/25.0')
http.proxy = proxy if proxy
r = http.get(link)
raise r.status.to_s if r.status != 200
return r.body
end
到目前为止效果很好。有人向我建议 URL 可能会被 http 客户端转义,所以我添加了 unescape 东西。我在 return 中得到的是一个空字符串,而不是我的程序为缺失数据生成的信息(= 使用正则表达式的匹配失败)。但是,使用 URI.escape 没有任何改变,所以可能就是这样。但是,我不知道还能尝试什么。
此外,我程序中的所有字符串始终采用 UTF-8(无 BOM)格式。
尝试用 URI.parse 调用它,像这样:
http = HTTPClient.new(:agent_name => 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:12.0) Gecko/20100101 Firefox/25.0')
http.proxy = proxy if proxy
r = http.get(URI.parse(link))