我正在尝试从requests
获取原始网址。以下是我到目前为止的情况:
res = requests.get(...)
url = urllib.unquote(res.url).decode('utf8')
然后我收到一条错误消息:
UnicodeEncodeError: 'ascii' codec can't encode characters in position 60-61: ordinal not in range(128)
我要求的原始网址是:
https://www.microsoft.com/de-at/store/movies/american-pie-pr\xc3\xa4sentiert-nackte-tatsachen/8d6kgwzl63ql
以下是我尝试打印时会发生的事情:
>>> print '111', res.url
111 https://www.microsoft.com/de-at/store/movies/american-pie-pr%C3%A4sentiert-nackte-tatsachen/8d6kgwzl63ql
>>> print '222', urllib.unquote( res.url )
222 https://www.microsoft.com/de-at/store/movies/american-pie-präsentiert-nackte-tatsachen/8d6kgwzl63ql
>>> print '333', urllib.unquote(res.url).decode('utf8')
UnicodeEncodeError: 'ascii' codec can't encode characters in position 60-61: ordinal not in range(128)
为什么会发生这种情况,我该如何解决这个问题?
答案 0 :(得分:2)
UnicodeEncodeError: 'ascii' codec can't encode characters
您正在尝试解码已经是Unicode的字符串。它在Python 3上引发AttributeError
(unicode字符串没有.decode()
方法。 Python 2首先使用sys.getdefaultencoding()
('ascii'
)将字符串编码字符串转换为字节,然后将其传递给导致.decode('utf8')
的{{1}}。
简而言之,不要在Unicode字符串上调用UnicodeEncodeError
,请改用:
.decode()
没有print urllib.unquote(res.url.encode('ascii')).decode('utf-8')
调用,代码打印字节(假设字节串传递给.decode()
),如果您的环境使用的字符编码不是utf-8,则可能导致mojibake。为了避免使用mojibake,始终打印Unicode (不要将文本打印为字节),请不要在脚本中硬编码环境的字符编码,即{{1这里是必要的。
There is a bug in urllib.unquote()
if you pass it a Unicode string:
unquote()
在Python 2上将字节串传递给.decode()
。