2013-05-15 22 views
151

Spędziłem dużo czasu, o ile jestem początkującym w Pythonie.
Jak mogłem kiedykolwiek zdekodować taki URL:Dekodowanie adresu URL UTF-8 w Pythonie

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 

do tego w Pythonie 2.7: example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) wraca coś bardzo brzydki.

Nadal nie ma rozwiązania, każda pomoc jest doceniana.

+0

w ogólnym przypadku, ogon URL jest właśnie cookie. Nie można się dowiedzieć, które kodowanie lokalnego zestawu znaków wykorzystuje serwer, ani nawet czy URL koduje ciąg znaków lub coś zupełnie innego. (Przyznane, wiele adresów URL * powoduje * kodowanie czytelne dla człowieka i często bardzo łatwo jest odgadnąć kodowanie, ale nie jest to możliwe w ogólnym przypadku lub całkowicie automatycznie.) – tripleee

Odpowiedz

239

Dane jest kodowanie UTF-8 bajtów uciekł z URL cytowanie, więc chcesz dekodowania:

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

Demo:

>>> import urllib 
>>> 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' 
>>> urllib.unquote(url).decode('utf8') 
u'example.com?title=\u043f\u0440\u0430\u0432\u043e\u0432\u0430\u044f+\u0437\u0430\u0449\u0438\u0442\u0430' 
>>> print urllib.unquote(url).decode('utf8') 
example.com?title=правовая+защита 

Python 3 równoważne jest urllib.parse.unquote(), który przez domyślnie obsługuje dekodowanie:

from urllib.parse import unquote 

url = unquote(url) 
+0

Dziękuję za wysiłek Martijn Próbowałem tego również, ale podczas dekodowania ---- urllib.unquote (url) .decode ('utf8') ---- Otrzymuję wybuch błędu mówiąc "UnicodeEncodeError: kodek 'ascii' nie może kodować znaków na pozycji 20- 27: porządek nie w zasięgu (128) " – swordholder

+0

@swordholder: Robisz coś innego niż dobrze. Czy łączysz ciągi bajtów z danymi wyjściowymi? Czy próbujesz wydrukować to na konsoli systemu Windows? Spróbuj wykonać * tylko * część 'urllib.unquote (url) .decode ('utf8'). –

+0

@swordholder: Czy 'url' może być wartością Unicode? W mojej sesji demo użyłem na przykład wartości bytestring, ** not ** a unicode. –

97

Jeśli jesteś re przy użyciu Python 3, można użyć 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) 

daje:

'example.com?title=правовая+защита'