【问题标题】:Can't open Python encoded URL containing Cyrillic symbols无法打开包含西里尔符号的 Python 编码 URL
【发布时间】:2011-10-19 19:14:26
【问题描述】:

我有以下网址“mysite.com/\u0422\u0435\u043A\u0441\u0442 \u043D\u0430 \u043A\u0438\u0440\u0438\u043B\u0438\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' codec can't encoding characters in position 12-17: ordinal not in range(128)"

我从 JSON 中获取此 URL。

我该如何解决这个问题?

【问题讨论】:

    标签: python url encoding


    【解决方案1】:

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

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

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

    你想要的结果是:

    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 框架都有类似的功能)。如果您想全力纠正和规范可疑的传入 URL,还有this

    【讨论】:

    • 感谢您的回答。我明白了,但我无法让它发挥作用。 import urllib s = '\u0422\u0435\u043A\u0441\u0442\u043D\u0430\u043A\u0438\u0440\u0438\u043B\u0438\‌​u0446\u0430' s = s.encode('UTF-8') print s print urllib.urlencode(s) 我收到一个错误“TypeError:不是有效的非字符串序列或映射对象”
    • s 是一个字节字符串,因此您的 \u 序列没有做任何事情。使用u'\u0422...' 获取一个Unicode 字符串,您可以在该字符串上调用encode('utf-8')。那么你想要的 URL 编码函数是urlquote()urlencode() 采用键和值的映射来创建查询字符串,这不是您想要的。
    • 这为我完成了工作:# -*- coding: utf-8 -*- import urllib s = unicode('\u0422\u0435\u043A\u0441\u0442\u043D\u0430\u043A\u0438\u0440\u0438\u043B\u0438\‌​‌​u0446\u0430', errors='ignore') s = s.encode('utf-8') print urllib.quote(s)@bobince 谢谢!
    猜你喜欢
    • 2016-05-10
    • 2018-02-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-05-17
    • 1970-01-01
    • 2014-07-17
    • 2013-10-16
    相关资源
    最近更新 更多