Ich weiß, das ist eine alte Frage, aber ich bin über sie bei der Google-Suche gestolpert und habe festgestellt, dass niemand eine Lösung nur mit eingebauten Features vorgeschlagen hat.
Also habe ich schnell meine eigene geschrieben.
Grundsätzlich kann eine URL-Zeichenkette nur diese Zeichen enthalten: A-Z, a-z, 0-9, -, ., _, ~, :, /, ?, #, [, ], @, !, $, &, ', (, ), *, +, ,, ;, % und =, alles andere wird URL-codiert.
URL-Codierung ist ziemlich geradlinig, einfach ein Prozentzeichen gefolgt von den hexadezimalen Ziffern der Byte-Werte, die den Codepunkten von ungültigen Zeichen entsprechen.
Also im Grunde genommen sollte es perfekt funktionieren, indem man eine einfache while-Schleife benutzt, um die Zeichen zu durchlaufen, fügt man jedes Byte als solches hinzu, wenn es kein Prozentzeichen ist, erhöht man den Index um eins. Andernfalls fügt man das Byte nach dem Prozentzeichen hinzu und erhöht den Index um drei, akkumuliert die Bytes und das Dekodieren sollte perfekt funktionieren.
Hier ist der Code:
def url_parse(url):
l = len(url)
data = bytearray()
i = 0
while i < l:
if url[i] != '%':
d = ord(url[i])
i += 1
else:
d = int(url[i+1:i+3], 16)
i += 3
data.append(d)
return data.decode('utf8')
Ich habe es getestet und es funktioniert perfekt.