Spec-Zone.ru › Python 3.12

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

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

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

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

Модуль 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-адрес и, следовательно, начинается с компонента пути.

>>> 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, идентификаторы фрагментов не распознаются. Вместо этого они анализируются как часть компонента пути, параметров или запроса, и 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: Добавлены возможности разбора URL-адресов IPv6.

Изменено в версии 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 определяют, как декодировать кодированные процентами последовательности в символы Unicode, как это принимается методом bytes.decode().

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

Необязательный аргумент 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 — это флаг, указывающий, должны ли пустые значения в процентах кодированных запросах обрабатываться как пустые строки. Значение True указывает, что пустые значения должны сохраняться как пустые строки. Значение по умолчанию False указывает, что пустые значения игнорируются и обрабатываются так, как будто они не были включены.

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

Необязательные параметры encoding и errors определяют, как декодировать проценты кодированные последовательности в символы Unicode, как это принимается методом 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: Ведущие управляющие символы C0 и пробелы WHATWG удаляются из 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.

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

urllib.parse.urldefrag(url)

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

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

Атрибут

Индекс

Значение

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

url

0

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

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

fragment

1

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

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

См. раздел Структурированные результаты разбора для получения дополнительной информации об объекте результата.

Изменено в версии 3.2: Результат — структурированный объект, а не простой 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-кодированных байтов

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

Объекты результатов функций 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. Дополнительные ASCII символы, которые не должны кодироваться, задаются параметром safe; его значение по умолчанию равно '/'.

строка может быть объектом типа 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 символы, требующие раскодирования в строке, кодируются в 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 текста с кодировкой процентов. Если результирующая строка должна использоваться в качестве данных для операции 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.

См. также

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.12/library/urllib.parse.html

Spec-Zone.ru

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