Url decodifica UTF-8 in Python


245

Ho trascorso un sacco di tempo per quanto sono principiante in Python.
Come potrei mai decodificare un simile 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

a questo in Python 2.7: example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) sta restituendo qualcosa di molto brutto.

Ancora nessuna soluzione, ogni aiuto è apprezzato.


2
Nel caso generale, la coda di un URL è solo un cookie. Non puoi sapere quale set di caratteri locale codifica il server o se l'URL codifica una stringa o qualcosa di completamente diverso. (Certo, molti URL fanno codificare una stringa leggibile, e spesso, si può intuire la codifica molto facilmente, ma non è possibile nel caso in generale o in modo completamente automatico..)
tripleee

Risposte:


398

I dati sono byte codificati UTF-8 con escape tra virgolette URL, quindi si desidera decodificare , con urllib.parse.unquote(), che gestisce la decodifica da dati con codifica percentuale in byte UTF-8 e quindi in testo, in modo trasparente:

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

L'equivalente di Python 2 è urllib.unquote(), ma questo restituisce un bytestring, quindi dovresti decodificare manualmente:

from urllib import unquote

url = unquote(url).decode('utf8')

Quindi perché il carattere + è rimasto nella stringa? Pensavo che% 2B fosse il carattere + e che + letterali fossero rimossi durante la decodifica?
AlexLordThorsen,

5
@Rawrgulmuffins +è uno spazio nei x-www-form-urlencodeddati ; useresti urllib.parse.parse_qs()per analizzarlo, o userai urllib.parse.unquote_plus(). Ma dovrebbero apparire solo nella stringa della query, non nel resto dell'URL.
Martijn Pieters

140

Se si utilizza Python 3, è possibile utilizzare 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=правовая+защита'

usando questo e ottenendo un dict invece di una stringa di query su python3.8
Clocker
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.