Кодирование URL-параметров в Python: обход проблем urllib.quote
Пройдите тест, узнайте какой профессии подходите
Быстрый ответ
Чтобы процентно закодировать параметры URL в Python, можно использовать urllib.parse.quote
. Если вам требуется заменить пробелы символом +
, воспользуйтесь urllib.parse.quote_plus
.
Кодирование с помощью
quote
:from urllib.parse import quote print(quote('param с / & spaces')) # Возвращает: 'param%20with%20%2F%20%26%20spaces'
Кодирование с помощью
quote_plus
:from urllib.parse import quote_plus print(quote_plus('param с / & spaces')) # Возвращает: 'param+with+%2F+%26+spaces'
Работа с версиями Python и символами Unicode
Процентное кодирование наиболее удобно проводить в Python 3, поскольку в этой версии осуществляется полная поддержка Unicode. В Python 2 для работы с Unicode-символами их предварительно пришлось бы кодировать в UTF-8, в то время как Python 3 справляется с этой задачей без особого труда.
Python 2: Необходимы дополнительные шаги для кодирования:
print(urllib.quote(u'üníćødé'.encode('utf-8'))) # Выводит: %C3%BCn%C3%AD%C4%87%C3%B3d%C3%A9
Python 3: Поддержка Unicode обеспечивается «из коробки»:
from urllib.parse import quote print(quote('üníćødé')) # Выводит: '%C3%BCn%C3%AD%C4%87%C3%B3d%C3%A9'
Используйте параметр safe
в функции quote
для указания символов, которые не должны подвергаться кодированию. По умолчанию он установлен на '/'
, что означает, что слеши не будут закодированы.
print(quote('param/with/slashes', safe=''))
# Выводит: 'param%2Fwith%2Fslashes'
Как управлять 'безопасностью'
Параметр safe
функции процентного кодирования по умолчанию установлен на '/', вот как с ним работать:
- Символы
[A-Za-z]
,[0-9]
и'_.-~'
кодировать незачем. - Если нужно, чтобы слеши были закодированы, установите
safe=''
. - Если требуется заменять пробелы на '+', выберите
quote_plus
. В противном случае функцияquote
закодирует пробелы как%20
.
Воспользуйтесь urllib.parse.urlencode
Если вам нужно сформировать строку запроса URL с множеством параметров, подойдёт функция urllib.parse.urlencode
. Она проста в использовании и позволяет легко форматировать запрос:
from urllib.parse import urlencode
params = {
'name': 'John Doe',
'job': 'Developer/Coder'
}
print(urlencode(params))
# Выводит: 'name=John+Doe&job=Developer%2FCoder'
Эта функция преобразует словарь в формат, подходящий для части URL-запроса.
Визуализация
Можно представить процесс кодирования параметров URL как наклейку уникальных этикеток на символы:
Исходный символ: Пробел 🡒 " " Вопросительный знак 🡒 "?" Доллар 🡒 "$"
Закодированный: Пробел 🡒 "%20" Вопросительный знак 🡒 "%3F" Доллар 🡒 "%24"
Схематичное представление процесса (URL-кодирование):
До кодирования📦: [А, Б, Пробел, В, Знак вопроса, Г, Доллар, Д]
После кодирования📦: [А, Б, %20, В, %3F, Г, %24, Д]
Каждый специальный символ получает свою уникальную «этикетку», прежде чем отправиться в большой интернет.
Попробуйте альтернативные библиотеки
Хотя библиотека urllib
в Python отлично подходит для работы с URL, есть и другие варианты:
Библиотека
requests
:from requests.utils import quote
Фреймворк
Django
:from django.utils.http import urlquote
Искусство декодирования URL
Иногда требуется обратное преобразование – декодирование URL. Для этой задачи подходит функция urllib.parse.unquote
:
from urllib.parse import unquote
print(unquote('param%20with%20%2F%20%26%20spaces'))
# Выводит: 'param with / & spaces'
Изучите документацию на тему
При нужде в более подробном изучении темы обработки URL зайдите в документацию Python 3 по модулю urllib.parse. Она предоставит пошаговый мануал для решения любых задач.
Полезные материалы
- urllib.parse — Разбор URL на составляющие — официальная документация Python.
- RFC 3986 – Унифицированный идентификатор ресурса (URI): Общий синтаксис — официальная спецификация.
- Как процентно-кодировать параметры URL в Python? – Stack Overflow — обсуждение с примерами кодирования URL.
- Advanced Usage — Документация Requests — руководство по продвинутому использованию библиотеки Requests.
- HTML URL Encoding Reference — упрощенное объяснение и примеры кодирования URL.
- Процентное кодирование – Глоссарий MDN Web Docs — обзор процесса кодирования.
- HTTP Made Really Easy — подробное руководство по работе с HTTP.