Python编码问题。无法打开包含西里尔符号的网址

时间:2011-08-04 09:01:23

标签: python url encoding

我有一个惊人的网址“mysite.com/ \ u0422 \ u0435 \ u043A \ u0441 \ u0442 \ u043D \ u0430 \ u043A \ u0440 \ u0440 \ u0438 \ u043B \ u0444 \ u0446 \ u0430”(“mysite.com/ Текстнакирилица“)。我想使用浏览器

的browser.open(link)打开此URL
$CHandler = urllib2.HTTPCookieProcessor(cookielib.CookieJar())
browser = urllib2.build_opener(CHandler)
user_agent = '  Mozilla/5.0 (Windows; U; Windows NT 5.1; en-US; rv:1.9.2.17) Gecko/20110420 Firefox/3.6.17'
browser.addheaders = [('User-agent', user_agent )]
urllib2.install_opener(browser)

我得到错误:“UnicodeEncodeError:'ascii'编解码器无法编码位置12-17中的字符:序数不在范围内(128)” 我从json那里得到这个url。 干杯!

1 个答案:

答案 0 :(得分:4)

mysite.com/Текст на кирилица不是网址:

  • 因为它省略了http://(或其他)架构;
  • 它有空格,无效;
  • 因为URIs不能包含非ASCII字符。只有IRIs可以,urllib2不支持。

因此,您需要修复断点,% - 编码带外字符(如空格 - > %20),如果缺少则添加架构,然后将IRI转换为URI。要进行此转换,您需要使用IDN算法(Python:s.encode('idna'))对地址的主机名部分进行编码,然后使用UTF-8对地址的其他部分中的任何非ASCII字符进行编码然后%-encoding。

您最终想要的是:

http://mysite.com/%D0%A2%D0%B5%D0%BA%D1%81%D1%82%20%D0%BD%D0%B0%20%D0%BA%D0%B8%D1%80%D0%B8%D0%BB%D0%B8%D1%86%D0%B0

这是urllib2接受的有效URI,但在您关注时也会在浏览器的地址栏中显示为http://mysite.com/Текст на кирилица

有很多关于实现IRI-to-URI的函数(大多数Python Web框架都有类似的东西)。如果你想要纠正和规范可疑的传入网址,那么还有this