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