URL dekodiert UTF-8 in Python

245

Ich habe viel Zeit damit verbracht, Neuling in Python zu sein.
Wie könnte ich jemals eine solche URL entschlüsseln:

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

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

url=urllib.unquote(url.encode("utf8")) gibt etwas sehr Hässliches zurück.

Immer noch keine Lösung, jede Hilfe wird geschätzt.

Schwerthalter
quelle
2
Im Allgemeinen ist das Ende einer URL nur ein Cookie. Sie können nicht wissen, welche lokale Zeichensatzcodierung der Server verwendet oder ob die URL eine Zeichenfolge oder etwas völlig anderes codiert. (Zugegeben, viele URLs tun kodieren eine für Menschen lesbare Zeichenfolge, und oft können Sie die Codierung erraten sehr leicht Aber es ist nicht möglich , in der Regel Fall oder vollautomatisch..)
tripleee

Antworten:

398

Bei den Daten handelt es sich um UTF-8-codierte Bytes, die mit URL-Anführungszeichen maskiert wurden. Sie möchten also mit decodieren , urllib.parse.unquote()wodurch die Decodierung von prozentual codierten Daten in UTF-8-Bytes und anschließend in Text transparent erfolgt:

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

Das Python 2-Äquivalent ist urllib.unquote(), aber dies gibt einen Bytestring zurück, sodass Sie manuell dekodieren müssten:

from urllib import unquote

url = unquote(url).decode('utf8')
Martijn Pieters
quelle
Warum bleibt das Zeichen + in der Zeichenfolge? Ich dachte, dass% 2B das + Zeichen war und + Literale während der Dekodierung entfernt wurden?
AlexLordThorsen
5
@Rawrgulmuffins +ist ein Leerzeichen in x-www-form-urlencodedDaten ; Sie würden verwenden urllib.parse.parse_qs(), um das zu analysieren, oder verwenden urllib.parse.unquote_plus(). Sie sollten jedoch nur in der Abfragezeichenfolge angezeigt werden, nicht im Rest der URL.
Martijn Pieters
140

Wenn Sie Python 3 verwenden, können Sie verwenden 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)

gibt:

'example.com?title=правовая+защита'
Pavan
quelle
Verwenden Sie dies und erhalten Sie ein Diktat anstelle einer Abfragezeichenfolge für Python3.8
Clocker,