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.


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

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

Verwenden Sie dies und erhalten Sie ein Diktat anstelle einer Abfragezeichenfolge für Python3.8
Clocker,
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.