URL编码请求
URLDecoding requests
我正在尝试从 requests
获取原始 url。这是我目前所拥有的:
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)
原来我要求的url是:
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)
为什么会发生这种情况,我该如何解决?
UnicodeEncodeError: 'ascii' codec can't encode characters
您正在尝试解码已经是 Unicode 的字符串。它在 Python 3 上引发 AttributeError
(unicode 字符串在那里没有 .decode()
方法)。 Python 2 尝试先使用 sys.getdefaultencoding()
('ascii'
) 将字符串 编码为字节,然后再将其传递给 .decode('utf8')
,从而导致 UnicodeEncodeError
.
简而言之,不要在 Unicode 字符串上调用 .decode()
,而是使用它:
print urllib.unquote(res.url.encode('ascii')).decode('utf-8')
没有 .decode()
调用,代码会打印字节(假设将字节串传递给 unquote()
),如果您的环境使用的字符编码不是 utf-8,则可能导致乱码。为避免 mojibake,始终打印 Unicode(不要将 text 打印为字节),不要在脚本中对环境的字符编码进行硬编码,即, 这里需要.decode()
.
There is a bug in urllib.unquote()
if you pass it a Unicode string:
>>> print urllib.unquote(u'%C3%A4')
ä
>>> print urllib.unquote('%C3%A4') # utf-8 output
ä
在 Python 上将字节串传递给 unquote()
2.
我正在尝试从 requests
获取原始 url。这是我目前所拥有的:
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)
原来我要求的url是:
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)
为什么会发生这种情况,我该如何解决?
UnicodeEncodeError: 'ascii' codec can't encode characters
您正在尝试解码已经是 Unicode 的字符串。它在 Python 3 上引发 AttributeError
(unicode 字符串在那里没有 .decode()
方法)。 Python 2 尝试先使用 sys.getdefaultencoding()
('ascii'
) 将字符串 编码为字节,然后再将其传递给 .decode('utf8')
,从而导致 UnicodeEncodeError
.
简而言之,不要在 Unicode 字符串上调用 .decode()
,而是使用它:
print urllib.unquote(res.url.encode('ascii')).decode('utf-8')
没有 .decode()
调用,代码会打印字节(假设将字节串传递给 unquote()
),如果您的环境使用的字符编码不是 utf-8,则可能导致乱码。为避免 mojibake,始终打印 Unicode(不要将 text 打印为字节),不要在脚本中对环境的字符编码进行硬编码,即, 这里需要.decode()
.
There is a bug in urllib.unquote()
if you pass it a Unicode string:
>>> print urllib.unquote(u'%C3%A4')
ä
>>> print urllib.unquote('%C3%A4') # utf-8 output
ä
在 Python 上将字节串传递给 unquote()
2.