为什么网址解码无法将+转换为空格? - python

为什么+不转换为空格:

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

python大神给出的解决方案

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

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

这是因为URL引用有两种变体。一个用于URL路径段,另一个用于URL查询参数;后者使用不同的规范。参见Wikipedia:

提交已输入HTML表单的数据后,将使用GET或POST方法或历史上通过电子邮件以HTTP请求消息的形式对表单字段名称和值进行编码并发送到服务器。默认情况下使用的编码基于通用URI百分比编码规则的早期版本,并进行了许多修改,例如换行符标准化和用"+"代替"%20"替换空格。

因此,在GET或POST请求中使用application/x-www-form-urlencoded MIME类型的表单使用略有不同的规则,其中规则将空格编码为+,但是在URL中编码字符时,将使用%20。解码时,您需要选择正确的变体。您拥有表单数据(来自URL的查询部分),因此需要使用unquote_plus()

现在,如果要解析查询字符串,则可能需要使用urlparse.parse_qs()urlparse.parse_qsl()函数;这些不仅将使用正确的unquote*()函数,还将参数解析为字典或键值对列表:

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