URL декодировать UTF-8 в Python

245

Я провел много времени, насколько я новичок в Python.
Как я мог когда-либо расшифровать такой 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

к этому в Python 2.7: example.com?title==правовая+защита

url=urllib.unquote(url.encode("utf8")) возвращает что-то очень некрасивое.

Все еще нет решения, любая помощь приветствуется.

swordholder
источник
2
В общем случае хвост URL - это просто cookie. Вы не можете знать, какую локальную кодировку набора символов использует сервер или даже URL-адрес кодирует строку или что-то совершенно другое. (Предоставленные, много ссылок делают закодировать строку удобочитаемой, и часто, вы можете угадать кодировку очень легко , но это не представляется возможным в общем случае или полностью автоматически.)
tripleee

Ответы:

398

Данные представляют собой байты в кодировке UTF-8 с экранированием в кавычках URL, поэтому вы хотите декодировать с помощью urllib.parse.unquote(), который обрабатывает декодирование из данных, кодированных в процентах, в байты UTF-8, а затем в текст, прозрачно:

from urllib.parse import unquote

url = unquote(url)

Демо-версия:

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

Эквивалент Python 2 есть urllib.unquote(), но он возвращает строку байтов, поэтому вам придется декодировать вручную:

from urllib import unquote

url = unquote(url).decode('utf8')
Мартейн Питерс
источник
Так почему символ + остается в строке? Я думал, что% 2B был символ + и литералы + были удалены во время декодирования?
AlexLordThorsen
5
@Rawrgulmuffins +- это пробел в x-www-form-urlencodedданных ; вы бы использовали, urllib.parse.parse_qs()чтобы разобрать это, или использовать urllib.parse.unquote_plus(). Но они должны появляться только в строке запроса, а не в остальной части URL.
Мартин Питерс
140

Если вы используете Python 3, вы можете использовать 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)

дает:

'example.com?title=правовая+защита'
павана
источник
используя это и получая dict вместо строки запроса на python3.8
Clocker