Decodificação de URL UTF-8 em Python

245

Passei muito tempo, tanto quanto eu sou novato em Python.
Como eu poderia decodificar esse 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

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

url=urllib.unquote(url.encode("utf8")) está retornando algo muito feio.

Ainda sem solução, qualquer ajuda é apreciada.

porta-espada
fonte
2
No caso geral, a cauda de um URL é apenas um cookie. Você não pode saber qual conjunto de caracteres local de codificação o servidor usa ou mesmo se o URL codifica uma sequência ou algo completamente diferente. (Concedido, muitos URLs fazer codificar uma string legível; e, muitas vezes, você pode adivinhar a codificação muito facilmente Mas não é possível no caso geral ou completamente automaticamente..)
tripleee

Respostas:

398

Os dados são bytes codificados em UTF-8 e escapados com a citação de URL. Portanto, você deseja decodificar , with urllib.parse.unquote(), que manipula a decodificação de dados codificados em porcentagem para bytes UTF-8 e, em seguida, para texto, de forma transparente:

from urllib.parse import unquote

url = unquote(url)

Demo:

>>> 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=правовая+защита'

O equivalente em Python 2 é urllib.unquote(), mas isso retorna uma cadeia de bytes, portanto você precisará decodificar manualmente:

from urllib import unquote

url = unquote(url).decode('utf8')
Martijn Pieters
fonte
Então, por que o caractere + permanece na string? Eu pensei que% 2B foi o caractere + e + literais foram removidos durante a decodificação?
AlexLordThorsen
5
@Rawrgulmuffins +é um espaço nos x-www-form-urlencodeddados ; você usaria urllib.parse.parse_qs()para analisar isso ou usar urllib.parse.unquote_plus(). Mas eles devem aparecer apenas na string de consulta, não no restante da URL.
Martijn Pieters
140

Se você estiver usando Python 3, poderá 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)

dá:

'example.com?title=правовая+защита'
Pavan
fonte
usando este e obter um dicionário em vez de consulta corda no python3.8
Clocker