无法打开包含西里尔符号的Python编码URL
我有一个网址 "mysite.com/\u0422\u0435\u043A\u0441\u0442 \u043D\u0430 \u043A\u0438\u0440\u0438\u043B\u0438\u0446\u0430"(也就是 "mysite.com/Текст на кирилица")。我想用 browser.open(link) 来打开这个网址,其中 browser 是
$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' codec can't encode characters in position 12-17: ordinal not in range(128)"
这个网址是我从 JSON 中获取的。
我该怎么解决这个问题呢?
1 个回答
5
mysite.com/Текст на кирилица
不是一个有效的网址:
所以你需要修复这些问题,像把空格转换成 %20
这样的编码,添加缺失的协议前缀,然后把 IRI 转换成 URI。要进行这个转换,你需要使用 IDN 算法对地址中的主机名部分进行编码(在 Python 中用 s.encode('idna')
),然后对地址其他部分的非ASCII字符使用 UTF-8 编码,再进行百分号编码。
你最终想要得到的是:
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
这是一个有效的 URI,可以被 urllib2
接受,同时在浏览器地址栏中显示为 http://mysite.com/Текст на кирилица
当你访问它时。
有很多函数可以实现 IRI 到 URI 的转换(大多数 Python 网络框架都有类似的功能)。如果你想全面修正和规范可疑的输入网址,还有 这个。