import urllib.parse urllib.parse.quote(string, safe='/', encoding=None, errors=None) urllib.parse.quote_plus(string, safe='', encoding=None, errors=None)
string
- обрабатываемый URL-адрес,safe
- символы ASCII, которые не следует цитировать,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
заменила на знак '+'
.