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

88

Как я могу преобразовать данные после обработки urllib.urlencodeв dict? 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
Очень обстоятельный ответ. Потрясающие!
Хартли Броуди
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()делает что хотите. Он заменяет escape-последовательности% xx их односимвольными эквивалентами и заменяет знаки плюса на пробелы.

Пример:

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

дает

'/~candidates/?name=john connolly'.
Эндрю Фаррелл
источник
2
Он сказал, что хочет диктовку. Значит, ваш ответ неверен.
balrok
4
ура, это то, что я искал.
Джо