Python,与函数urllib.urlencode相反
Posted
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了Python,与函数urllib.urlencode相反相关的知识,希望对你有一定的参考价值。
在处理urllib.urlencode
到dict之后如何转换数据? urllib.urldecode
不存在。
答案
正如the docs的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
和“round-tripped”一个d1
之间的明显区别是后者(单项,在这种情况下)列表为值 - 这是因为查询字符串中没有唯一性保证,它可能对于您的应用来说,了解每个键的多个值是多么重要(也就是说,列表并不总是单项的;-)。
作为备选:
>>> sq = urlparse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}
你可以获得一系列对(urlencode也接受这样的参数 - 在这种情况下它保留了顺序,而在dict情况下则没有保留顺序;-)。如果您知道没有重复的“密钥”,或者不关心是否存在,那么(如我所示)您可以调用dict
来获取具有非列表值的字典。但是,一般情况下,如果存在重复项,您需要考虑要执行的操作(Python不代表您决定;-)。
另一答案
Python 3 code为Alex的解决方案:
>>> 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'
另一答案
urllib.unquote_plus()
做你想要的。它用单字符等价物替换%xx转义符,并用空格替换加号。
例:
unquote_plus('/%7Ecandidates/?name=john+connolly')
产量
'/~candidates/?name=john connolly'.
以上是关于Python,与函数urllib.urlencode相反的主要内容,如果未能解决你的问题,请参考以下文章