URLDecoding请求

时间:2015-12-27 04:44:05

标签: python unicode python-requests urlencode

我正在尝试从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)

为什么会发生这种情况,我该如何解决这个问题?

1 个答案:

答案 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()