为什么不将Url解码转换为空格?

时间:2015-03-14 08:10:31

标签: python python-2.7 urllib

为什么+未转换为空格:

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

1 个答案:

答案 0 :(得分:4)

有两种变体; 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类型的表单使用稍微不同的规则,其中一个空格被编码为+,但是当编码字符时使用了网址%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?')]