Python, протилежна функція urllib.urlencode


88

Як я можу перетворити дані після обробки urllib.urlencodeв дикт? urllib.urldecodeне існує.

Відповіді:


124

Як Документи для urlencodeговоримо,

Модуль urlparse надає функції parse_qs () та parse_qsl (), які використовуються для синтаксичного аналізу рядків запитів на структури даних Python.

(У старих версіях Python вони були в cgiмодулі). Так, наприклад:

>>> import urllib
>>> import urlparse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urlparse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}

Очевидна відмінність оригінального словника dвід "кругового" d1полягає в тому, що останній має (у цьому випадку окремі елементи) списки як значення - це тому, що в рядках запитів немає гарантії унікальності, і це може бути важливо до вашого додатка, щоб дізнатись про те, які множинні значення були надані для кожного ключа (тобто списки не завжди складатимуться з одиниць ;-).

Як альтернатива:

>>> sq = urlparse.parse_qsl(s)
>>> sq  
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

Ви можете отримати послідовність пар (urlencode також приймає такий аргумент - в цьому випадку він зберігає порядок, тоді як у випадку dict немає порядку для збереження ;-). Якщо ви знаєте, що дублікатів "ключів" немає, або вам байдуже, чи є вони, тоді (як я вже показав) ви можете зателефонувати, dictщоб отримати словник зі значеннями, що не входять до списку. Загалом, однак, вам потрібно подумати, що ви хочете зробити, якщо є дублікати (Python не вирішує це від вашого імені ;-).


1
Дуже ґрунтовна відповідь. Чудово!
Hartley Brody

1
Проголосуйте за Python 2, однак Python 3 знаходиться в urllibмодулі. Дивіться відповідь @phobie.
openwonk

19

Код Python 3 для рішення Alex:

>>> import urllib.parse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.parse.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urllib.parse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}

Альтернатива:

>>> sq = urllib.parse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

parse_qsl є оборотним:

>>> urllib.parse.urlencode(sq)
'a=b&c=d'

16

urllib.unquote_plus()роби те, що ти хочеш. Він замінює% xx втечі їх односимвольним еквівалентом і замінює знаки плюс пробілами.

Приклад:

unquote_plus('/%7Ecandidates/?name=john+connolly') 

врожайність

'/~candidates/?name=john connolly'.

2
Він сказав, що хоче постанову. Отже, ваша відповідь неправильна.
balrok

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