Python, противоположная функция urllib.urlencode - PullRequest
85 голосов
/ 22 августа 2010

Как я могу преобразовать данные после обработки urllib.urlencode в dict?urllib.urldecode не существует.

Ответы [ 3 ]

117 голосов
/ 22 августа 2010

Как документы для 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 не решит это от вашего имени; -).

16 голосов
/ 26 февраля 2014

urllib.unquote_plus() делает то, что вы хотите. Он заменяет% xx на их символьный эквивалент и заменяет знаки плюс пробелами.

Пример:

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

урожайность

'/~candidates/?name=john connolly'.
16 голосов
/ 17 апреля 2012

Код Python 3 для решения Алекса:

>>> 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'
...