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")) повертає щось дуже потворне.

Все ще немає рішення, будь-яка допомога не цінується.


2
У загальному випадку хвіст URL-адреси - це лише печиво. Ви не можете знати, який локальний набір символів кодує сервер, або навіть 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-адреси.
Martijn Pieters

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

скориставшись цим і отримавши дикт замість рядка запиту на python3.8
Clocker
Використовуючи наш веб-сайт, ви визнаєте, що прочитали та зрозуміли наші Політику щодо файлів cookie та Політику конфіденційності.
Licensed under cc by-sa 3.0 with attribution required.