Spec-Zone.ru › Python 3.13

urllib.parse — Разбор URL на компоненты

Исходный код: Lib/urllib/parse.py

Этот модуль определяет стандартный интерфейс для разбиения строк URL (Uniform Resource Locator) на компоненты (схема адресации, сетевое расположение, путь и т. д.), для объединения компонентов обратно в строку URL и для преобразования «относительного URL» в абсолютный URL, используя «базовый URL».

Модуль разработан в соответствии с интернет-RFC по относительному Uniform Resource Locators. Он поддерживает следующие схемы URL: file, ftp, gopher, hdl, http, https, imap, itms-services, mailto, mms, news, nntp, prospero, rsync, rtsp, rtsps, rtspu, sftp, shttp, sip, sips, snews, svn, svn+ssh, telnet, wais, ws, wss.

Подробность реализации CPython: Включение схемы URL itms-services может помешать приложению пройти проверку в Apple App Store для macOS и iOS. Обработка схемы itms-services всегда удаляется в iOS; в macOS она может быть удалена, если CPython был скомпилирован с опцией --with-app-store-compliance.

Модуль urllib.parse определяет функции, которые можно разделить на две широкие категории: разбор URL и кодирование URL. Эти функции подробно описаны в следующих разделах.

Функции этого модуля используют устаревшее понятие netloc (или net_loc), которое было введено в RFC 1808. Однако этот термин устарел, и RFC 3986 ввел термин authority в качестве замены. Использование netloc сохраняется для обратной совместимости.

Парсинг URL

Функции парсинга URL ориентированы на разделение строки URL на компоненты или объединение компонентов URL в строку URL.

urllib.parse.urlparse(urlstring, scheme='', allow_fragments=True)

Разбирает URL на шесть компонентов, возвращая 6-элементную именованную кортеж. Это соответствует общей структуре URL: scheme://netloc/path;parameters?query#fragment. Каждый элемент кортежа — это строка, возможно пустая. Компоненты не разбиваются на более мелкие части (например, сетевое расположение — это одна строка), и % escapes не расширяются. Разделители, как показано выше, не являются частью результата, за исключением ведущей косой черты в компоненте path, которая сохраняется, если она присутствует. Например:

>>> from urllib.parse import urlparse
>>> urlparse("scheme://netloc/path;parameters?query#fragment")
ParseResult(scheme='scheme', netloc='netloc', path='/path;parameters', params='',
            query='query', fragment='fragment')
>>> o = urlparse("http://docs.python.org:80/3/library/urllib.parse.html?"
...              "highlight=params#url-parsing")
>>> o
ParseResult(scheme='http', netloc='docs.python.org:80',
            path='/3/library/urllib.parse.html', params='',
            query='highlight=params', fragment='url-parsing')
>>> o.scheme
'http'
>>> o.netloc
'docs.python.org:80'
>>> o.hostname
'docs.python.org'
>>> o.port
80
>>> o._replace(fragment="").geturl()
'http://docs.python.org:80/3/library/urllib.parse.html?highlight=params'

В соответствии с синтаксическими спецификациями в RFC 1808, urlparse распознаёт netloc только если он корректно введён с помощью ‘//’. В противном случае входной параметр предполагается относительным URL и, следовательно, начинается с компонента path.

>>> from urllib.parse import urlparse
>>> urlparse('//www.cwi.nl:80/%7Eguido/Python.html')
ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            params='', query='', fragment='')
>>> urlparse('www.cwi.nl/%7Eguido/Python.html')
ParseResult(scheme='', netloc='', path='www.cwi.nl/%7Eguido/Python.html',
            params='', query='', fragment='')
>>> urlparse('help/Python.html')
ParseResult(scheme='', netloc='', path='help/Python.html', params='',
            query='', fragment='')

Аргумент scheme задаёт схему адресации по умолчанию, используемую только в случае, если URL её не указывает. Он должен быть того же типа (текст или байты), что и urlstring, за исключением того, что значение по умолчанию '' всегда разрешено и автоматически преобразуется в b'' при необходимости.

Если аргумент allow_fragments имеет значение false, идентификаторы фрагментов не распознаются. Вместо этого они анализируются как часть компонента path, parameters или query, и fragment устанавливается в пустую строку в возвращаемом значении.

Возвращаемое значение — это именованная кортеж, что означает, что к её элементам можно получить доступ по индексу или как именованным атрибутам, которые следующие:

Атрибут

Индекс

Значение

Значение, если отсутствует

scheme

0

Указатель схемы URL

параметр scheme

netloc

1

Часть сетевого расположения

пустая строка

path

2

Иерархический путь

пустая строка

params

3

Параметры для последнего элемента пути

пустая строка

query

4

Компонент запроса

пустая строка

fragment

5

Идентификатор фрагмента

пустая строка

username

Имя пользователя

None

password

Пароль

None

hostname

Имя хоста (в нижнем регистре)

None

port

Номер порта как целое число, если он присутствует

None

Чтение атрибута port вызовет ValueError, если в URL указан недопустимый порт. Дополнительную информацию об объекте результата см. в разделе Структурированные результаты разбора.

Несовпадающие квадратные скобки в атрибуте netloc вызовут ValueError.

Символы в атрибуте netloc , которые декомпозируются при нормализации NFKC (как используется в кодировке IDNA) в любой из /, ?, #, @, или : вызовут ValueError. Если URL декомпозируется перед анализом, ошибка не будет вызвана.

Как и во всех именованных кортежах, у подкласса есть несколько дополнительных методов и атрибутов, которые особенно полезны. Одним из таких методов является _replace(). Метод _replace() вернёт новый объект ParseResult, заменяющий указанные поля новыми значениями.

>>> from urllib.parse import urlparse
>>> u = urlparse('//www.cwi.nl:80/%7Eguido/Python.html')
>>> u
ParseResult(scheme='', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            params='', query='', fragment='')
>>> u._replace(scheme='http')
ParseResult(scheme='http', netloc='www.cwi.nl:80', path='/%7Eguido/Python.html',
            params='', query='', fragment='')

Предупреждение

urlparse() не выполняет валидацию. Подробности см. в разделе Безопасность при парсинге URL.

Изменено в версии 3.2: Добавлены возможности парсинга IPv6 URL.

Изменено в версии 3.3: Фрагмент теперь анализируется для всех схем URL (если allow_fragments не равно false) в соответствии с RFC 3986. Ранее существовал список разрешённых схем, поддерживающих фрагменты.

Изменено в версии 3.6: Порты вне диапазона теперь вызывают ValueError вместо возвращения None.

Изменено в версии 3.8: Символы, влияющие на парсинг netloc при нормализации NFKC, теперь вызывают ValueError.

urllib.parse.parse_qs(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&')

Разбирает строку запроса, заданную в виде строки аргумента (данные типа application/x-www-form-urlencoded). Данные возвращаются в виде словаря. Ключами словаря являются уникальные имена переменных запроса, а значениями — списки значений для каждого имени.

Необязательный аргумент keep_blank_values — флаг, указывающий, должны ли пустые значения в процентах кодированных запросах обрабатываться как пустые строки. Значение true указывает, что пробелы должны сохраняться как пустые строки. Значение по умолчанию false указывает, что пустые значения игнорируются и обрабатываются так, как будто они не включены.

Необязательный аргумент strict_parsing — флаг, указывающий, что делать с ошибками при разборе. Если значение false (значение по умолчанию), ошибки игнорируются. Если значение true, ошибки вызывают исключение ValueError.

Необязательные параметры encoding и errors указывают, как декодировать проценты кодированные последовательности в символы Юникода, как это принимает метод bytes.decode().

Необязательный аргумент max_num_fields — максимальное количество полей для чтения. Если задано, при чтении более max_num_fields полей генерируется ValueError.

Необязательный аргумент separator — символ, используемый для разделения аргументов запроса. По умолчанию &.

Используйте функцию urllib.parse.urlencode() (с параметром doseq установленным в True ), чтобы преобразовать такие словари в строки запроса.

Изменено в версии 3.2: Добавлены параметры encoding и errors.

Изменено в версии 3.8: Добавлен параметр max_num_fields.

Изменено в версии 3.10: Добавлен параметр separator со значением по умолчанию &. В версиях Python до Python 3.10 разрешалось использовать как ; , так и & в качестве разделителя параметров запроса. Это было изменено, чтобы разрешить использование только одного разделителя, со значением & по умолчанию.

urllib.parse.parse_qsl(qs, keep_blank_values=False, strict_parsing=False, encoding='utf-8', errors='replace', max_num_fields=None, separator='&')

Разбор строки запроса, заданной как строковый аргумент (данные типа application/x-www-form-urlencoded). Данные возвращаются в виде списка пар имя-значение.

Необязательный аргумент keep_blank_values — флаг, указывающий, должны ли пустые значения в процентах кодированных запросах обрабатываться как пустые строки. Истинное значение указывает, что пробелы должны сохраняться как пустые строки. Неверное значение по умолчанию указывает, что пустые значения игнорируются и обрабатываются так, как будто их не было.

Необязательный аргумент strict_parsing — флаг, указывающий, что делать при ошибках разбора. Если ложь (по умолчанию), ошибки молча игнорируются. Если истина, генерируется исключение ValueError.

Необязательные параметры encoding и errors указывают, как декодировать проценты кодированные последовательности в символы Юникода, как принимается методом bytes.decode().

Необязательный аргумент max_num_fields — максимальное количество полей для чтения. Если задано, выбрасывает исключение ValueError, если прочитано более max_num_fields полей.

Необязательный аргумент separator — символ, используемый для разделения аргументов запроса. По умолчанию &.

Используйте функцию urllib.parse.urlencode() для преобразования таких списков пар в строки запроса.

Изменено в версии 3.2: Добавлены параметры encoding и errors.

Изменено в версии 3.8: Добавлен параметр max_num_fields.

Изменено в версии 3.10: Добавлен параметр separator со значением по умолчанию &. Версии Python, предшествующие Python 3.10, разрешали использование ; и & в качестве разделителя параметров запроса. Это было изменено, чтобы разрешить использование только одного разделителя, при этом & является разделителем по умолчанию.

urllib.parse.urlunparse(parts)

Создает URL из кортежа, возвращенного urlparse(). Аргумент parts может быть любым итерируемым объектом из шести элементов. Это может привести к немного другому, но эквивалентному URL, если первоначально анализированный URL содержал лишние разделители (например, ? со пустым запросом; RFC утверждает, что они эквивалентны).

urllib.parse.urlsplit(urlstring, scheme='', allow_fragments=True)

Это аналогично urlparse(), но не разделяет параметры от URL. Это следует обычно использовать вместо urlparse(), если требуется более новый синтаксис URL, позволяющий применять параметры к каждому сегменту части path URL (см. RFC 2396). Для разделения сегментов пути и параметров требуется отдельная функция. Эта функция возвращает кортеж из 5 элементов именованного кортежа:

(addressing scheme, network location, path, query, fragment identifier).

Возвращаемое значение — именованный кортеж, к его элементам можно обратиться по индексу или по имени:

Атрибут

Индекс

Значение

Значение, если отсутствует

scheme

0

Спецификатор схемы URL

Параметр scheme

netloc

1

Часть сетевого расположения

пустая строка

path

2

Иерархический путь

пустая строка

query

3

Компонент запроса

пустая строка

fragment

4

Идентификатор фрагмента

пустая строка

username

Имя пользователя

None

password

Пароль

None

hostname

Имя хоста (строчные буквы)

None

port

Номер порта как целое число, если присутствует

None

Обращение к атрибуту port вызовет исключение ValueError, если в URL указан недопустимый порт. Подробнее об объекте результатов см. в разделе Результаты структурированного разбора.

Несоответствующие квадратные скобки в атрибуте netloc вызовут исключение ValueError.

Символы в атрибуте netloc , которые разлагаются при нормализации NFKC (как используется в кодировании IDNA), в любой из /, ?, #, @, или : вызовет исключение ValueError. Если URL разложен до анализа, никакой ошибки не будет.

В соответствии с некоторыми аспектами WHATWG spec, обновляющего RFC 3986, ведущие управляющие символы C0 и пробелы удаляются из URL. \n, \r и табуляции \t символы удаляются из URL в любом положении.

Предупреждение

urlsplit() не выполняет проверку. Подробности см. в разделе Безопасность разбора URL.

Изменено в версии 3.6: Порты вне диапазона теперь вызывают ValueError, а не возвращают None.

Изменено в версии 3.8: Символы, влияющие на разбор netloc при нормализации NFKC, теперь будут вызывать исключение ValueError.

Изменено в версии 3.10: ASCII символы перевода строки и табуляции удаляются из URL.

Изменено в версии 3.12: Ведущие WHATWG-символы управления C0 и пробелы удаляются из URL.

urllib.parse.urlunsplit(parts)

Объединяет элементы кортежа, возвращенного urlsplit(), в полную строку URL. Аргумент parts может быть любым итерируемым объектом из пяти элементов. Это может привести к немного другому, но эквивалентному URL, если первоначально анализированный URL содержал лишние разделители (например, ? со пустым запросом; RFC утверждает, что они эквивалентны).

urllib.parse.urljoin(base, url, allow_fragments=True)

Строит полный («абсолютный») URL путем объединения «базового URL» (base) с другим URL (url). Неформально, это использует компоненты базового URL, в частности схему адресации, сетевое расположение и (часть) пути, чтобы предоставить недостающие компоненты в относительном URL. Например:

>>> from urllib.parse import urljoin
>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html', 'FAQ.html')
'http://www.cwi.nl/%7Eguido/FAQ.html'

Аргумент allow_fragments имеет то же значение и по умолчанию, что и для urlparse().

Примечание

Если url является абсолютным URL (то есть он начинается с // или scheme://), имя хоста и/или схема url будут присутствовать в результате. Например:

>>> urljoin('http://www.cwi.nl/%7Eguido/Python.html',
...         '//www.python.org/%7Eguido')
'http://www.python.org/%7Eguido'

Если вам не нужно такое поведение, предварительно обработайте url с помощью urlsplit() и urlunsplit(), удалив возможные части scheme и netloc.

Предупреждение

Так как абсолютный URL может быть передан в качестве параметра url, использование urljoin с управляемым злоумышленником url обычно не безопасно. Например, в urljoin("https://website.com/users/", username), если username может содержать абсолютный URL, результат urljoin будет абсолютным URL.

Изменено в версии 3.5: Поведение обновлено для соответствия семантике, определенной в RFC 3986.

urllib.parse.urldefrag(url)

Если url содержит идентификатор фрагмента, вернуть изменённую копию url без идентификатора фрагмента и сам идентификатор фрагмента в виде отдельной строки. Если в url нет идентификатора фрагмента, вернуть url без изменений и пустую строку.

Результат — это именованная кортеж, его элементы можно получить по индексу или имени:

Атрибут

Индекс

Значение

Значение при отсутствии

url

0

URL без фрагмента

пустая строка

fragment

1

Идентификатор фрагмента

пустая строка

Дополнительную информацию о результате см. в разделе Структурированные результаты разбора.

Изменено в версии 3.2: Результат — структурированный объект, а не простой кортеж из двух элементов.

urllib.parse.unwrap(url)

Извлечь URL из обернутого URL (то есть строки, отформатированной как <URL:scheme://host/path>, <scheme://host/path>, URL:scheme://host/path или scheme://host/path). Если url не является обернутым URL, он возвращается без изменений.

Безопасность при разборе URL

API urlsplit() и urlparse() не выполняют валидацию ввода. Они могут не вызывать ошибки для ввода, который другие приложения считают некорректным. Они также могут успешно обрабатывать некоторые данные, которые могут не считаться URL в других местах. Их цель — практическая функциональность, а не чистота.

Вместо того, чтобы вызывать исключение при необычном вводе, они могут вернуть некоторые компоненты в виде пустых строк. Или компоненты могут содержать больше данных, чем это необходимо.

Мы рекомендуем пользователям этих API, где значения могут быть использованы где угодно с последствиями для безопасности, разработать защитный код. Проверьте данные в своём коде перед доверием возвращаемым компонентам. Это scheme имеет смысл? Это разумный path? Есть ли что-то странное в этом hostname? и т.д.

Что представляет собой URL, не имеет универсального определения. У разных приложений разные потребности и ограничения. Например, актуальный спецификация WHATWG описывает требования веб-клиентов, таких как веб-браузер. В то время как RFC 3986 более общий. Эти функции учитывают некоторые аспекты обоих, но не могут претендовать на соответствие ни одному из них. API и существующий пользовательский код с ожиданиями по определённому поведению появились раньше обоих стандартов, что заставляет нас быть очень осторожными в отношении изменений поведения API.

Разбор ASCII-кодированных байтов

Функции разбора URL изначально были разработаны для работы только со строками символов. На практике полезно уметь манипулировать должным образом процитированными и закодированными URL-адресами как последовательностями ASCII-байтов. Соответственно, все функции разбора URL в этом модуле работают с bytes и bytearray объектами помимо str объектов.

Если передаются данные типа str, результат также будет содержать только данные типа str. Если передаются данные типа bytes или bytearray, результат будет содержать только данные типа bytes.

Попытка смешать данные типа str с bytes или bytearray в одном вызове функции приведёт к возбуждению TypeError, а попытка передачи не-ASCII байтовых значений — к возбуждению UnicodeDecodeError.

Для облегчения преобразования объектов результата между str и bytes, все значения возвращаемые функциями разбора URL предоставляют либо метод encode() (когда результат содержит данные типа str), либо метод decode() (когда результат содержит данные типа bytes). Подписи этих методов соответствуют подписям соответствующих методов str и bytes (за исключением того, что кодировка по умолчанию — 'ascii' , а не 'utf-8'). Каждый метод возвращает значение соответствующего типа, содержащее либо данные типа bytes (для методов encode()) либо данные типа str (для методов decode()).

Приложениям, которым необходимо работать с потенциально неправильно процитированными URL-адресами, которые могут содержать не-ASCII данные, необходимо выполнить собственное декодирование из байтов в символы до вызова функций разбора URL.

Описанное в этом разделе поведение применяется только к функциям разбора URL. Функции цитирования URL используют свои правила при создании или использовании последовательностей байтов, как подробно описано в документации по отдельным функциям цитирования URL.

Изменено в версии 3.2: Функции разбора URL теперь принимают ASCII-кодированные последовательности байтов

END_OF_DOCUMENT_MARKER

Результаты структурированной разборки

Объекты результатов из функций urlparse(), urlsplit() и urldefrag() являются подклассами типа tuple. Эти подклассы добавляют атрибуты, перечисленные в документации этих функций, поддержку кодирования и декодирования, описанную в предыдущем разделе, а также дополнительный метод:

urllib.parse.SplitResult.geturl()

Возвращает объединённую версию исходного URL-адреса в виде строки. Она может отличаться от исходного URL-адреса тем, что схема может быть нормализована к нижнему регистру, а пустые компоненты могут быть удалены. В частности, пустые параметры, запросы и идентификаторы фрагментов будут удалены.

Для результатов urldefrag() будут удалены только пустые идентификаторы фрагментов. Для результатов urlsplit() и urlparse() все указанные изменения будут внесены в URL, возвращаемый этим методом.

Результат этого метода остаётся неизменным, если его передать обратно в исходную функцию разбора:

>>> from urllib.parse import urlsplit
>>> url = 'HTTP://www.Python.org/doc/#'
>>> r1 = urlsplit(url)
>>> r1.geturl()
'http://www.Python.org/doc/'
>>> r2 = urlsplit(r1.geturl())
>>> r2.geturl()
'http://www.Python.org/doc/'

Следующие классы предоставляют реализации результатов структурированной разборки при работе с объектами str:

class urllib.parse.DefragResult(url, fragment)

Конкретный класс для результатов urldefrag(), содержащих данные str. Метод encode() возвращает экземпляр DefragResultBytes.

Добавлен в версии 3.2.

class urllib.parse.ParseResult(scheme, netloc, path, params, query, fragment)

Конкретный класс для результатов urlparse(), содержащих данные str. Метод encode() возвращает экземпляр ParseResultBytes.

class urllib.parse.SplitResult(scheme, netloc, path, query, fragment)

Конкретный класс для результатов urlsplit(), содержащих данные str. Метод encode() возвращает экземпляр SplitResultBytes.

Следующие классы предоставляют реализации результатов разбора при работе с объектами bytes или bytearray:

class urllib.parse.DefragResultBytes(url, fragment)

Конкретный класс для результатов urldefrag(), содержащих данные bytes. Метод decode() возвращает экземпляр DefragResult.

Добавлен в версии 3.2.

class urllib.parse.ParseResultBytes(scheme, netloc, path, params, query, fragment)

Конкретный класс для результатов urlparse(), содержащих данные bytes. Метод decode() возвращает экземпляр ParseResult.

Добавлен в версии 3.2.

class urllib.parse.SplitResultBytes(scheme, netloc, path, query, fragment)

Конкретный класс для результатов urlsplit(), содержащих данные bytes. Метод decode() возвращает экземпляр SplitResult.

Добавлен в версии 3.2.

Кодирование URL

Функции кодирования URL предназначены для преобразования данных программы в безопасный формат для использования в компонентах URL, кодируя специальные символы и должным образом кодируя текст, не являющийся ASCII. Они также поддерживают обратное преобразование, позволяя восстановить исходные данные из содержимого компонента URL, если эта задача не покрывается функциями разбора URL выше.

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

Заменяет специальные символы в строке с использованием кодировки %xx. Буквы, цифры и символы '_.-~' никогда не кодируются. По умолчанию функция предназначена для кодирования секции пути URL. Необязательный параметр safe задаёт дополнительные ASCII-символы, которые не должны кодироваться — его значение по умолчанию '/'.

Строка может быть объектом типа str или bytes.

Изменено в версии 3.7: Перемещено из RFC 2396 в RFC 3986 для кодирования строк URL. «~» теперь включён в набор нерезервированных символов.

Необязательные параметры encoding и errors определяют способ обработки символов, не являющихся ASCII, как это принимается методом str.encode(). encoding по умолчанию 'utf-8'. errors по умолчанию 'strict', что означает, что недопустимые символы вызывают исключение UnicodeEncodeError. encoding и errors не должны передаваться, если string является объектом bytes, иначе будет выброшено исключение TypeError.

Обратите внимание, что quote(string, safe, encoding, errors) эквивалентно quote_from_bytes(string.encode(encoding, errors), safe).

Пример: quote('/El Niño/') возвращает '/El%20Ni%C3%B1o/'.

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

Аналогично quote(), но также заменяет пробелы на знаки плюс, как требуется для кодирования значений HTML-форм при построении строки запроса для URL. Знаки плюс в исходной строке экранируются, если они не включены в safe. Также у него по умолчанию safe не равно '/'.

Пример: quote_plus('/El Niño/') возвращает '%2FEl+Ni%C3%B1o%2F'.

urllib.parse.quote_from_bytes(bytes, safe='/')

Аналогично quote(), но принимает объект bytes вместо str и не выполняет кодирование строки в байты.

Пример: quote_from_bytes(b'a&\xef') возвращает 'a%26%EF'.

urllib.parse.unquote(string, encoding='utf-8', errors='replace')

Заменяет кодировки %xx на соответствующие им односимвольные эквиваленты. Необязательные параметры encoding и errors задают способ декодирования процентов-кодированных последовательностей в символы Юникода, как это принимается методом bytes.decode().

Строка может быть объектом типа str или bytes.

encoding по умолчанию 'utf-8'. errors по умолчанию 'replace', что означает, что неверные последовательности заменяются символом-заменителем.

Пример: unquote('/El%20Ni%C3%B1o/') возвращает '/El Niño/'.

Изменено в версии 3.9: Параметр string поддерживает объекты типа bytes и str (раньше поддерживался только str).

urllib.parse.unquote_plus(string, encoding='utf-8', errors='replace')

Аналогично unquote(), но также заменяет знаки плюс на пробелы, как требуется для раскодирования значений HTML-форм.

Строка должна быть объектом типа str.

Пример: unquote_plus('/El+Ni%C3%B1o/') возвращает '/El Niño/'.

urllib.parse.unquote_to_bytes(string)

Заменяет кодировки %xx на их однобайтовые эквиваленты и возвращает объект bytes.

Строка может быть объектом типа str или bytes.

Если это str, то не-ASCII символы в string кодируются в UTF-8 байты.

Пример: unquote_to_bytes('a%26%EF') возвращает b'a&\xef'.

urllib.parse.urlencode(query, doseq=False, safe='', encoding=None, errors=None, quote_via=quote_plus)

Преобразует объект отображения или последовательность пар из двух элементов, которые могут содержать объекты типа str или bytes, в строку ASCII с процентами-кодированием. Если полученная строка должна использоваться в качестве параметра data для операции POST с функцией urlopen(), то она должна быть закодирована в байты, иначе это приведёт к TypeError.

Результирующая строка — это последовательность пар key=value разделённых символами '&', где и ключ, и значение кодируются с помощью функции quote_via. По умолчанию используется функция quote_plus() для кодирования значений, что означает, что пробелы кодируются как символ '+', а символы '/' кодируются как %2F, что соответствует стандарту для запросов GET (application/x-www-form-urlencoded). Альтернативная функция, которую можно передать как quote_via, — это quote(), которая закодирует пробелы как %20 и не закодирует символы '/'. Для максимального контроля над тем, что кодируется, используйте quote и укажите значение для safe.

Когда в качестве аргумента query используется последовательность пар из двух элементов, первый элемент каждой пары — ключ, а второй — значение. Сам элемент значения может быть последовательностью, и в этом случае, если необязательный параметр doseq равен True, для каждого элемента последовательности значений для ключа генерируются отдельные пары key=value разделённые символами '&' . Порядок параметров в закодированной строке будет соответствовать порядку пар параметров в последовательности.

Параметры safe, encoding и errors передаются в quote_via (параметры encoding и errors передаются только тогда, когда элемент запроса является str).

Для обратного преобразования этого кодирования в данном модуле предоставлены parse_qs() и parse_qsl() для разбора строк запроса в структуры данных Python.

Обратитесь к примерам urllib, чтобы узнать, как метод urllib.parse.urlencode() можно использовать для генерации строки запроса URL или данных для запроса POST.

Изменено в версии 3.2: query поддерживает объекты типа bytes и string.

Изменено в версии 3.5: Добавлен параметр quote_via.

END_OF_DOCUMENT_MARKER

См. также

WHATWG - Стандарт URL

Рабочая группа по стандарту URL, определяющая URL, домены, IP-адреса, формат application/x-www-form-urlencoded и их API.

RFC 3986 - Унифицированные идентификаторы ресурсов

Текущий стандарт (STD66). Любые изменения в модуле urllib.parse должны соответствовать ему. Могут наблюдаться определённые отклонения, в основном для обеспечения обратной совместимости и для определённых требований к парсингу, как обычно наблюдается в основных браузерах.

RFC 2732 - Формат литеральных IPv6-адресов в URL.

Определяет требования к парсингу IPv6-URL.

RFC 2396 - Унифицированные идентификаторы ресурсов (URI): Общая синтаксическая структура

Документ, описывающий общие синтаксические требования как для унифицированных имён ресурсов (URN), так и для унифицированных локаторов ресурсов (URL).

RFC 2368 - Схема mailto URL.

Требования к парсингу схем mailto URL.

RFC 1808 - Относительные унифицированные локаторы ресурсов

В этом документе Request For Comments приведены правила объединения абсолютного и относительного URL, включая большое количество «ненормальных примеров», которые регулируют обработку граничных случаев.

RFC 1738 - Унифицированные локаторы ресурсов (URL)

Определяет формальный синтаксис и семантику абсолютных URL.

© 2001–2024 Python Software Foundation
Licensed under the PSF License.
https://docs.python.org/3.13/library/urllib.parse.html

Spec-Zone.ru

Настройки Оффлайн Что нового Помощь О нас
Spec-Zone .ru
спецификации, руководства, описания, API