Python,相反的functionurllib.urlencode
如何处理urllib.urlencode
字典后转换数据? urllib.urldecode
不存在。
正如urlencode
文档所说,
urlparse模块提供了函数parse_qs()和parse_qsl(),用于将查询string分析为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
之间的明显区别在于,后者具有(单项,在这种情况下)作为值被列出 – 这是因为在查询string中没有唯一性保证,并且可能对你的应用程序来说很重要,要知道每个键的值是多less(也就是说,列表不总是单项的;)。
作为备选:
>>> sq = urlparse.parse_qsl(s) >>> sq [('a', 'b'), ('c', 'd')] >>> dict(sq) {'a': 'b', 'c': 'd'}
你可以得到一系列的对(urlencode也接受这样一个参数 – 在这种情况下,它保留了顺序,而在dict的情况下,没有命令来保存;-)。 如果你知道没有重复的“键”,或者不在乎是否有,那么(如我所示),你可以调用dict
得到一个非列表值的字典。 但是,一般来说,如果存在重复项,您确实需要考虑要执行的操作(Python不会以您的名义来决定;-)。
Alex的解决scheme的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']}
替代scheme:
>>> 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'
urllib.unquote_plus()做你想要的。 它用相同的单字符replace%xx转义符,并用空格replace加号。
例如:unquote_plus('/%7Ecandidates /?name = john + connolly')产生'/〜candidates /?name = john connolly'。