Urd decodificar UTF-8 en Python

245

He pasado mucho tiempo hasta donde soy novato en Python.
¿Cómo podría decodificar una URL así?

example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0

a este en python 2.7: example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) está devolviendo algo muy feo.

Todavía no hay solución, se agradece cualquier ayuda.

porta espada
fuente
2
En el caso general, la cola de una URL es solo una cookie. No puede saber qué codificación de juego de caracteres local usa el servidor o incluso si la URL codifica una cadena o algo completamente diferente. (Por supuesto, muchas URL hacen codificar una cadena legible; y, a menudo, se puede adivinar la codificación muy fácilmente pero no es posible en el caso general, o de forma totalmente automática..)
tripleee

Respuestas:

398

Los datos son bytes codificados en UTF-8 escapados con comillas URL, por lo que desea decodificar , con urllib.parse.unquote(), que maneja la decodificación de datos codificados en porcentaje a bytes UTF-8 y luego a texto, de forma transparente:

from urllib.parse import unquote

url = unquote(url)

Manifestación:

>>> from urllib.parse import unquote
>>> url = 'example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0'
>>> unquote(url)
'example.com?title=правовая+защита'

El equivalente de Python 2 es urllib.unquote(), pero esto devuelve una cadena de bytes, por lo que tendría que decodificar manualmente:

from urllib import unquote

url = unquote(url).decode('utf8')
Martijn Pieters
fuente
Entonces, ¿por qué queda el carácter + en la cadena? ¿Pensé que% 2B era el carácter + y los literales + fueron eliminados durante la decodificación?
AlexLordThorsen
55
@Rawrgulmuffins +es un espacio en x-www-form-urlencodeddatos ; que tendría que utilizar urllib.parse.parse_qs()para analizar eso, o utilizar urllib.parse.unquote_plus(). Pero solo deberían aparecer en la cadena de consulta, no en el resto de la URL.
Martijn Pieters
140

Si está usando Python 3, puede usar urllib.parse

url = """example.com?title=%D0%BF%D1%80%D0%B0%D0%B2%D0%BE%D0%B2%D0%B0%D1%8F+%D0%B7%D0%B0%D1%89%D0%B8%D1%82%D0%B0"""

import urllib.parse
urllib.parse.unquote(url)

da:

'example.com?title=правовая+защита'
pavana
fuente
usando esto y obteniendo un dict en lugar de una cadena de consulta en python3.8
Clocker