Как преобразовать данные после обработки urllib.urlencode
в dict?
urllib.urldecode
не существует.
Python, противоположная функция urllib.urlencode
Ответ 1
Как документы для 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
и "round-tripped" one d1
заключается в том, что последний имеет (в этом случае, один элемент) списки как значения - потому что нет гарантии уникальности в строках запроса, и может быть важно, чтобы ваше приложение узнало о том, что для каждого ключа было задано несколько значений (то есть списки не всегда будут однопользовательскими; -).
В качестве альтернативы:
>>> sq = urlparse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}
вы можете получить последовательность пар (urlencode также принимает такой аргумент - в этом случае он сохраняет порядок, тогда как в случае dict нет порядка для сохранения;-). Если вы знаете, что дублирующих "ключей" нет, или их не волнует, то (как я показал) вы можете вызвать dict
, чтобы получить словарь со значениями, отличными от списка. В общем, однако, вам нужно рассмотреть, что вы хотите сделать, если присутствуют дубликаты (Python не принимает решения об этом от вашего имени;).
Ответ 2
код 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'
Ответ 3
urllib.unquote_plus()
делает то, что вы хотите. Он заменяет% xx на их символьный эквивалент и заменяет знаки плюс пробелами.
Пример:
unquote_plus('/%7Ecandidates/?name=john+connolly')
доходность
'/~candidates/?name=john connolly'.