Почему 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?')]
Другие вопросы по тегам