Python,对面函数urllib.urlencode


88

处理urllib.urlencode成字典后如何转换数据? urllib.urldecode不存在。

Answers:


124

由于该文档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没有决定代表你;-)。


1
非常彻底的答案。太棒了!
哈特利·布罗迪

对Python 2表示赞成,但是Python 3已包含在urllib模块中。参见@phobie答案。
openwonk

18

Alex解决方案的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'

16

urllib.unquote_plus()做你想要的。它用单字符等效项替换%xx转义符,并用空格替换加号。

例:

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

产量

'/~candidates/?name=john connolly'.

2
他说,他想要一个命令。所以你的答案是错误的。
balrok 2014年

4
是的,这就是我想要的。
By using our site, you acknowledge that you have read and understand our Cookie Policy and Privacy Policy.
Licensed under cc by-sa 3.0 with attribution required.