无法打开包含西里尔符号的Python编码URL

3 投票
1 回答
3157 浏览
提问于 2025-04-16 22:52

我有一个网址 "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/Текст на кирилица 不是一个有效的网址:

  • 因为它缺少 http://(或者其他协议)前缀;
  • 里面有空格,这是不合法的;
  • 因为 URI 不能包含非ASCII字符。只有 IRI 可以包含这些字符,而 urllib2 不支持它们。

所以你需要修复这些问题,像把空格转换成 %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 网络框架都有类似的功能)。如果你想全面修正和规范可疑的输入网址,还有 这个

撰写回答