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.