Python,与函数urllib.urlencode相反

时间:2010-08-22 18:59:15

标签: python urllib

如何在处理urllib.urlencode到dict后转换数据? urllib.urldecode不存在。

3 个答案:

答案 0 :(得分:117)

urlencode的{​​{3}}说,

  

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 :(得分:16)

对于Alex的解决方案

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'

答案 2 :(得分:16)

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

示例:

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

产量

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