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

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

88
задан fifi finance 29 May 2016 в 10:44
поделиться

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 и «обходным» словарем d1 заключается в том, что последний имеет (в данном случае одноэлементный ) списки в качестве значений — это потому, что в строках запроса нет гарантии уникальности, и вашему приложению может быть важно знать, какие множественные значения были заданы для каждого ключа (то есть списки выиграли не всегда быть единичными ;-).

В качестве альтернативы:

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

вы можете получить последовательность пар (urlencode тоже принимает такой аргумент — в этом случае он сохраняет порядок, а в случае dict порядок сохранять не нужно ;-). Если вы знаете, что нет повторяющихся «ключей», или вам все равно, если они есть, то (как я показал) вы можете вызвать dict, чтобы получить словарь со значениями, не входящими в список. В общем, однако, вам нужно подумать, что вы хотите делать, если присутствуют дубликаты (Python не решает это от вашего имени;-).

121
ответ дан 24 November 2019 в 07:33
поделиться
Другие вопросы по тегам:

Похожие вопросы: