Peticiones de deencoding de URL

Estoy tratando de obtener la url original de las requests . Aquí está lo que tengo hasta ahora:

 res = requests.get(...) url = urllib.unquote(res.url).decode('utf8') 

Entonces me sale un error que dice:

 UnicodeEncodeError: 'ascii' codec can't encode characters in position 60-61: ordinal not in range(128) 

El url original que solicité es:

 https://www.microsoft.com/de-at/store/movies/american-pie-pr\xc3\xa4sentiert-nackte-tatsachen/8d6kgwzl63ql 

Y esto es lo que sucede cuando bash imprimir:

 >>> 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) 

¿Por qué ocurre esto y cómo puedo solucionarlo?

 UnicodeEncodeError: 'ascii' codec can't encode characters 

Estás intentando decodificar una cadena que ya es Unicode. .decode() AttributeError en Python 3 (la cadena Unicode no tiene ningún método .decode() allí). Python 2 intenta codificar la cadena en bytes primero usando sys.getdefaultencoding() ( 'ascii' ) antes de pasarla a .decode('utf8') que lleva a UnicodeEncodeError .

En resumen, no llame a .decode() en cadenas Unicode , use esto en su lugar:

 print urllib.unquote(res.url.encode('ascii')).decode('utf-8') 

Sin la llamada a .decode() , el código se imprime en bytes (suponiendo que se pasa una cadena de comprobación a unquote unquote() ) que puede llevar a mojibake si la encoding de caracteres utilizada por su entorno no es utf-8. Para evitar el mojibake, siempre imprima Unicode (no imprima texto como bytes), no codifique la encoding de caracteres de su entorno dentro de su script, es decir, .decode() es necesario aquí.


Hay un error en urllib.unquote() si le pasas una cadena Unicode :

 >>> print urllib.unquote(u'​%C3%A4') ä >>> print urllib.unquote('​%C3%A4') # utf-8 output ä 

Pase las secuencias de caracteres a unquote unquote() en Python 2.