Почему Url Decode не конвертирует + в пространство?
Почему +
не конвертируется в пробелы:
>>> import urllib
>>> url = 'Q=Who+am+I%3F'
>>> urllib.unquote(url)
'Q=Who+am+I?'
>>>
1 ответ
Есть два варианта; urllib.unqoute()
а также urllib.unquote_plus()
, Используйте последнее:
>>> import urllib
>>> url = 'Q=Who+am+I%3F'
>>> urllib.unquote_plus(url)
'Q=Who am I?'
Это потому, что есть два варианта цитирования URL; один для сегментов пути URL и один для параметров запроса URL; последний использует другую спецификацию. Смотрите Википедию:
Когда данные, введенные в формы HTML, отправляются, имена и значения полей формы кодируются и отправляются на сервер в сообщении HTTP-запроса с использованием метода GET или POST или, исторически, по электронной почте. Кодировка, используемая по умолчанию, основана на очень ранней версии общих правил процентного кодирования URI с рядом модификаций, таких как нормализация новой строки и замена пробелов на
"+"
вместо"%20"
,
Так что формы с использованием application/x-www-form-urlencoded
MIME-тип в запросе GET или POST использует немного другие правила, в которых пробелы кодируются в +
, но при кодировании символов в 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?')]