Python,反函数 urllib.urlencode

Posted

技术标签:

【中文标题】Python,反函数 urllib.urlencode【英文标题】:Python, opposite function urllib.urlencode 【发布时间】:2011-04-02 08:31:41 【问题描述】:

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

【问题讨论】:

【参考方案1】:

就像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 和“往返”字典 d1 之间的明显区别在于后者具有(在这种情况下为单项)lists 作为值 --这是因为在查询字符串中没有唯一性保证,对于您的应用来说,了解为每个键提供了哪些多个值可能很重要(也就是说,列表并不总是单项的;-)。

作为替代方案:

>>> sq = urlparse.parse_qsl(s)
>>> sq  
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
'a': 'b', 'c': 'd'

你可以得到一个对的序列(urlencode 也接受这样的参数——在这种情况下它保留了顺序,而在 dict 的情况下没有顺序可以保留;-)。如果您知道没有重复的“键”,或者不在乎是否有,那么(如我所示)您可以调用 dict 来获取包含非列表值的字典。但是,一般来说,您确实需要考虑如果存在重复项 时要做什么(Python 不会代表您做出决定;-)。

【讨论】:

非常彻底的答案。太棒了! 对 Python 2 投了赞成票,但是 Python 3 都在 urllib 模块中。请参阅@phobie 答案。【参考方案2】:

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'

【讨论】:

【参考方案3】:

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

例子:

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

产量

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

【讨论】:

他说,他想要一个字典。所以你的答案是错误的。 是的,这就是我要找的。​​span>

以上是关于Python,反函数 urllib.urlencode的主要内容,如果未能解决你的问题,请参考以下文章

python 高阶函数都有哪些

Python函数

Python的函数有哪些?

Python 函数声明和调用

python基础9 -----python内置函数

Python2 与 Python3 的 map 函数