Сообщить об ошибке.

Функция quote() и quote_plus() модуля urllib.parse в Python

Кодирование не ASCII символов в URL-адресе

Синтаксис:

import urllib.parse

urllib.parse.quote(string, safe='/', 
                   encoding=None, errors=None)

urllib.parse.quote_plus(string, safe='', 
                        encoding=None, errors=None)

Параметры:

Возвращаемое значение:

Описание:

Функция quote() модуля urllib.parse заменяет специальные символы в строке с помощью escape-символа '%xx'. Буквы, цифры и символы '_.-~' никогда не цитируются. Строка может быть объектом типа str или bytes.

По умолчанию эта функция предназначена для цитирования компонента пути URL-адреса. Необязательный аргумент safe определяет дополнительные символы ASCII, которые не следует цитировать. Для функции urllib.parse.quote() - его значение по умолчанию '/'.

Функция quote_plus() делает то же самое, НО также заменяет пробелы знаками плюс, как это требуется для цитирования значений HTML-формы при построении строки запроса для перехода в URL-адрес. Знаки плюс в исходной строке экранируются, если они не включены в значение аргумента safe. Аргумент safe для функции urllib.parse.quote_plus() НЕ имеет безопасного значения по умолчанию '/'.

Изменено в Python 3.7: переход с RFC 2396 на RFC 3986 для цитирования строк URL-адресов. Теперь символ '~' входит в набор незарегистрированных символов.

Необязательные аргументы encoding и errors определяют, как поступать с символами, отличными от ASCII, как это принято методом str.encode(). Кодировка encoding по умолчанию 'utf-8'. Обработчик ошибок error по умолчанию имеет значение 'strict', что означает, что неподдерживаемые символы вызывают исключение UnicodeEncodeError. Аргументы encoding и errors не должны указываться, если строка является байтовой строкой или возникает ошибка TypeError.

Обратите внимание, что:

urllib.parse.quote(string, safe, encoding, errors)

# эквивалентно

urllib.parse.quote_from_bytes(string.encode(encoding, errors), safe)

Примеры использования функций quote() и quoteplus()_:

>>> import urllib.parse

# закодируем компоненту из строки поиска  '/?text=строки&opt=0 0' 
>>> urllib.parse.quote('/?text=строки&opt=0 0', safe='?&=') 
# '/?text=%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8&opt=0%200'

# сделаем то же самое при помощи функции quote_plus()
urllib.parse.quote_plus('/?text=строки&opt=0 0', safe='?&=')
# '%2F?text=%D1%81%D1%82%D1%80%D0%BE%D0%BA%D0%B8&opt=0+0'

Из примера отчетливо видна разница в кодировании URL-адреса этими функциями. Функция urllib.parse.quote() оставила начальный слеш '/' без изменений и заменила пробел в значении параметра opt на сочетание символов %20.

Во втором случае видим, что функция urllib.parse.quote_plus() закодировала начальный слеш '/' сочетанием символов %2F, а пробел в значении параметра opt заменила на знак '+'.