Python 为什么';t Url解码转换+;去太空?

Python 为什么';t Url解码转换+;去太空?,python,python-2.7,urllib,Python,Python 2.7,Urllib,为什么+未转换为空格: >>> import urllib >>> url = 'Q=Who+am+I%3F' >>> urllib.unquote(url) 'Q=Who+am+I?' >>> 有两种变体urllib.unqoute()和。使用后者: >>> import urllib >>> url = 'Q=Who+am+I%3F' >>> urllib.unqu

为什么
+
未转换为空格:

>>> import urllib
>>> url = 'Q=Who+am+I%3F'
>>> urllib.unquote(url)
'Q=Who+am+I?'
>>>

有两种变体
urllib.unqoute()
和。使用后者:

>>> import urllib
>>> url = 'Q=Who+am+I%3F'
>>> urllib.unquote_plus(url)
'Q=Who am I?'
这是因为URL引用有两种变体;一个用于URL路径段,一个用于URL查询参数;后者使用不同的规范。见:

提交输入到HTML表单中的数据时,表单字段名称和值将被编码,并使用方法GET或POST,或历史上通过电子邮件,在HTTP请求消息中发送到服务器。默认情况下使用的编码基于非常早期版本的通用URI百分比编码规则,并进行了一些修改,例如换行符规范化和将空格替换为
“+”
,而不是
“%20”

因此,在GET或POST请求中使用
应用程序/x-www-form-urlencoded
mime类型的表单使用稍微不同的规则,其中空格编码为
+
,但在URL中编码字符时,使用
%20
。解码时,您需要选择正确的变体。您有表单数据(来自URL的查询部分),因此需要使用
unquote\u plus()

现在,如果您正在解析查询字符串,则可能需要使用or函数;它们不仅将使用右
unquote*()
函数,还将参数解析到字典或键值对列表中:

>>> import urlparse
>>> urlparse.parse_qs(url)
{'Q': ['Who am I?']}
>>> urlparse.parse_qsl(url)
[('Q', 'Who am I?')]