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



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

412   3  

3 ответов:

как документы на 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 чтобы получить словарь со значениями без списка. В общем, однако, вам нужно рассмотреть, что вы хотите сделать, если дубликаты are присутствует (Python не решает это от вашего имени; -).

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

пример: unquote_plus('/%7Ecandidates/?имя=Джон + Коннолли') дает ' / ~кандидаты/?имя=Джон Коннолли'.

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

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

Comments

    Ничего не найдено.