Этот модуль предоставляет стандартный интерфейс для разбора строки URL на компоненты (схема адресации, сетевое расположение, путь и т.д.), обратной сборки компонентов в строку URL, а также для преобразования «относительного URL» в абсолютный по заданному «базовому URL».
Модуль разработан в соответствии с интернет-стандартом RFC на относительные унифицированные указатели ресурсов. Он поддерживает следующие схемы 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 на пять компонентов и возвращает именованный кортежSplitResult или SplitResultBytes.
Это соответствует общей структуре URL:
scheme://netloc/path?query#fragment.
Каждый элемент кортежа – строка, возможно пустая, или None, если
missing_as_none равен true.
Неопределённые компоненты представляются пустой строкой (по умолчанию) или
None, если missing_as_none равен true.
Разделители, показанные выше, не входят в результат, за исключением
начального слэша в компоненте path, который сохраняется, если присутствует.
Кроме того, свойство netloc разбивается на следующие дополнительные атрибуты, добавляемые к возвращаемому объекту: username, password, hostname и port.
Процентно-кодированные последовательности не декодируются.
Следуя спецификациям синтаксиса в RFC 1808, urlsplit() распознает netloc только если он правильно обозначен через ‘//’. В противном случае считается, что входные данные являются относительным URL и, следовательно, начинаются с компонента пути.
Аргумент scheme задаёт схему адресации по умолчанию,
используемую только в том случае, если URL её не указывает. Он должен быть того же типа
(текст или байты), что и urlstring или None, за исключением того, что ''
допускается всегда и автоматически преобразуется в b'', если это уместно.
Если аргумент allow_fragments равен false, идентификаторы фрагментов
не распознаются. Вместо этого они разбираются как часть пути
или строки запроса, а fragment устанавливается в None или пустую
строку (в зависимости от значения missing_as_none) в возвращаемом значении.
Возвращаемое значение – это именованный кортеж, что означает, что к его элементам можно обращаться по индексу или по именованным атрибутам, которые:
Непарные квадратные скобки в атрибуте netloc возбуждают
ValueError.
Символы в атрибуте netloc, которые при
NFKC-нормализации (используемой в кодировке IDNA) раскладываются в любой из /, ?,
#, @ или :, возбуждают ValueError. Если URL
разложен до разбора, ошибка не возникнет.
В соответствии с некоторыми положениями спецификации WHATWG, которая обновляет RFC 3986, начальные управляющие символы C0
и пробелы удаляются из URL. Символы \n,
\r и табуляции \t удаляются из URL на любой позиции.
Как и все именованные кортежи, подкласс имеет несколько дополнительных методов
и атрибутов, которые особенно полезны. Один из таких методов – _replace().
Метод _replace() возвращает новый объект SplitResult,
заменяя указанные поля новыми значениями.
Изменено в версии 3.2: Добавлена возможность разбора URL с IPv6.
Изменено в версии 3.3: Фрагмент теперь разбирается для всех схем URL (если allow_fragments не равен
false), в соответствии с RFC 3986. Ранее существовал список разрешённых
схем, поддерживающих фрагменты.
Изменено в версии 3.6: Номера портов вне диапазона теперь возбуждают ValueError вместо
возврата None.
Изменено в версии 3.8: Символы, влияющие на разбор netloc при NFKC-нормализации, теперь
возбуждают ValueError.
Изменено в версии 3.10: Символы ASCII перевода строки и табуляции удаляются из URL.
Изменено в версии 3.12: Начальные управляющие символы C0 и пробелы (по WHATWG) удаляются из URL.
Изменено в версии 3.15: Добавлен параметр missing_as_none.
Разбирает строку запроса, переданную в качестве строкового аргумента (данные типа
application/x-www-form-urlencoded). Данные возвращаются в виде
словаря. Ключами словаря являются уникальные имена переменных запроса, а значениями – списки значений для каждого имени.
Необязательный аргумент keep_blank_values – это флаг, указывающий, следует ли обрабатывать пустые
значения в процентно-кодированных запросах как пустые строки. Значение True означает, что пустые значения должны сохраняться как пустые строки. Значение False по умолчанию означает, что пустые значения игнорируются и считаются отсутствующими.
Необязательный аргумент strict_parsing – это флаг, указывающий, что делать с
ошибками разбора. Если False (по умолчанию), ошибки молча игнорируются. Если True,
ошибки возбуждают исключение ValueError.
Необязательные параметры encoding и errors определяют, как декодировать
процентно-кодированные последовательности в символы Unicode, как это принимается методом
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 до 3.10 допускалось использование как ;, так и & в качестве разделителя параметров запроса. Теперь разрешён только один ключ-разделитель, и по умолчанию используется &.
Устарело с версии 3.14: Приём объектов с ложными значениями (например, 0 и []), за исключением пустых строк, байтоподобных объектов и None, теперь считается устаревшим.
Разбирает строку запроса, переданную в качестве строкового аргумента (данные типа
application/x-www-form-urlencoded). Данные возвращаются в виде списка
пар имя, значение.
Необязательный аргумент keep_blank_values – это флаг, указывающий, следует ли обрабатывать пустые
значения в процентно-кодированных запросах как пустые строки. Значение True означает, что пустые значения должны сохраняться как пустые строки. Значение False по умолчанию означает, что пустые значения игнорируются и считаются отсутствующими.
Необязательный аргумент strict_parsing – это флаг, указывающий, что делать с
ошибками разбора. Если False (по умолчанию), ошибки молча игнорируются. Если True,
ошибки возбуждают исключение ValueError.
Необязательные параметры encoding и errors определяют, как декодировать
процентно-кодированные последовательности в символы Unicode, как это принимается методом
bytes.decode().
Необязательный аргумент max_num_fields – это максимальное количество полей для
чтения. Если он задан, то при чтении более max_num_fields полей возбуждается ValueError.
Необязательный аргумент separator – это символ, используемый для разделения аргументов запроса. По умолчанию он равен &.
Используйте функцию urllib.parse.urlencode() для преобразования таких списков пар в строки запроса.
Изменено в версии 3.2: Добавлены параметры encoding и errors.
Изменено в версии 3.8: Добавлен параметр max_num_fields.
Изменено в версии 3.10: Добавлен параметр separator со значением по умолчанию &. В версиях Python до 3.10 допускалось использование как ;, так и & в качестве разделителя параметров запроса. Теперь разрешён только один ключ-разделитель, и по умолчанию используется &.
Собирает URL из кортежа, возвращаемого urlsplit(). Аргумент parts
может быть любым итерабельным объектом из пяти элементов.
Это может привести к незначительно отличающемуся, но эквивалентному URL, если
исходно разобранный URL содержал лишние разделители (например,
? с пустым запросом; согласно RFC, они эквивалентны).
Если keep_empty равен true, пустые строки сохраняются в результате (например,
? для пустого запроса), опускаются только компоненты None.
Это позволяет восстановить URL, который был разобран с опцией
missing_as_none=True.
По умолчанию keep_empty равен true, если parts является результатом
вызова urlsplit() с missing_as_none=True.
Изменено в версии 3.15: Добавлен параметр keep_empty.
Это похоже на urlsplit(), но дополнительно разделяет компонент path на path и params. Эта функция возвращает именованный кортеж из 6 элементов ParseResult или ParseResultBytes. Его элементы те же, что и в результате urlsplit(), за исключением того, что params вставляется на индекс 3 между path и query.
Эта функция основана на устаревших RFC 1738 и RFC 1808, в которых params указывался как основной компонент URL. В более современном синтаксисе URL параметры могут применяться к каждому сегменту части path (см. RFC 3986). Вместо urlparse() обычно следует использовать urlsplit(). Для разделения сегментов пути и параметров требуется отдельная функция.
Объединяет элементы кортежа, возвращаемого urlparse(), в
полный URL в виде строки. Аргумент parts может быть любым итерабельным
объектом из шести элементов.
Это может привести к незначительно отличающемуся, но эквивалентному URL, если
исходно разобранный URL содержал лишние разделители (например,
? с пустым запросом; согласно RFC, они эквивалентны).
Если keep_empty равен true, пустые строки сохраняются в результате (например,
? для пустого запроса), опускаются только компоненты None.
Это позволяет восстановить URL, который был разобран с опцией
missing_as_none=True.
По умолчанию keep_empty равен true, если parts является результатом
вызова urlparse() с missing_as_none=True.
Изменено в версии 3.15: Добавлен параметр keep_empty.
Строит полный («абсолютный») URL путём объединения «базового URL» (base) с другим URL (url). Неформально: используются компоненты базового URL, в частности схема адресации, сетевое расположение и (часть) пути, чтобы предоставить недостающие компоненты в относительном URL. Например:
Если такое поведение нежелательно, предварительно обработайте url с помощью urlsplit() и urlunsplit(), удалив возможные части scheme и netloc.
Предупреждение
Поскольку абсолютный URL может быть передан в качестве параметра url, в целом небезопасно использовать urljoin с контролируемым злоумышленником url. Например, в urljoin("https://website.com/users/",username), если username может содержать абсолютный URL, результатом urljoin будет этот абсолютный URL.
Изменено в версии 3.5: Поведение обновлено в соответствии с семантикой, определённой в RFC 3986.
Если url содержит идентификатор фрагмента, возвращает изменённую версию url
без идентификатора фрагмента, а сам идентификатор фрагмента – как отдельную
строку. Если идентификатора фрагмента в url нет, возвращает url без изменений
и пустую строку (по умолчанию) или None, если missing_as_none равен true.
Возвращаемое значение – именованный кортеж, его элементы доступны по индексу или как именованные атрибуты:
Извлекает URL из обёрнутого URL (то есть строки, отформатированной как <URL:scheme://host/path>, <scheme://host/path>, URL:scheme://host/path или scheme://host/path). Если url не является обёрнутым URL, он возвращается без изменений.
API urlsplit() и urlparse() не выполняют валидацию
входных данных. Они могут не вызывать ошибки на входных данных, которые другие приложения считают недопустимыми. Они также могут успешно обработать некоторые входные данные, которые в других местах не считаются URL. Их цель – практическая функциональность, а не чистота.
Вместо того чтобы вызывать исключение при необычном вводе, они могут вернуть некоторые части компонентов как пустые строки или None (в зависимости от значения аргумента missing_as_none).
Или компоненты могут содержать больше, чем, возможно, следовало бы.
Мы рекомендуем пользователям этих API, если значения могут использоваться где-либо с последствиями для безопасности, писать защитный код. Выполните некоторую проверку в своем коде, прежде чем доверять возвращенной составной части. Имеет ли scheme смысл? Разумен ли path? Нет ли чего-то странного в hostname? и т.д.
Что составляет URL – не общепринятое определение. Разные приложения имеют разные потребности и желаемые ограничения. Например, живая спецификация WHATWG описывает, что требуется пользовательским веб-клиентам, таким как веб-браузер. В то время как RFC 3986 является более общим. Эти функции включают некоторые аспекты обоих, но не могут считаться совместимыми ни с одним из них. API и существующий пользовательский код с ожиданиями определенного поведения предшествуют обоим стандартам, что заставляет нас быть очень осторожными с изменениями поведения API.
Функции разбора 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-кодированные последовательности байтов
Структурированные результаты разбора¶Structured Parse Results
Объекты результатов функций urlsplit(), urlparse() и urldefrag() являются подклассами типа tuple. Эти подклассы добавляют атрибуты, перечисленные в документации этих функций, поддержку кодирования и декодирования, описанную в предыдущем разделе, а также дополнительный метод:
Возвращает повторно собранную версию исходного URL в виде строки. Она может
отличаться от исходного URL тем, что схема может быть приведена к нижнему
регистру, а пустые компоненты могут быть отброшены. В частности, пустые параметры,
запросы и идентификаторы фрагментов будут удалены, если только URL не был разобран
с помощью missing_as_none=True.
Для результатов urldefrag() будут удалены только пустые идентификаторы фрагментов. Для результатов urlsplit() и urlparse() все отмеченные изменения будут применены к URL, возвращаемому этим методом.
Результат этого метода остается неизменным, если его снова передать через исходную функцию разбора:
Функции экранирования URL предназначены для преобразования программных данных в безопасный формат для использования в компонентах URL: они экранируют специальные символы и кодируют не-ASCII текст. Они также поддерживают обратные операции для восстановления исходных данных из содержимого компонента URL, если эта задача ещё не решается описанными выше функциями разбора URL.
Заменяет специальные символы в string с помощью экранирования %xx. Буквы, цифры и символы '_.-~' никогда не экранируются. По умолчанию эта функция предназначена для экранирования части пути URL. Необязательный параметр safe задаёт дополнительные ASCII-символы, которые не следует экранировать – его значение по умолчанию: '/'.
string может быть либо объектом 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('/ElNiño/') даёт '/El%20Ni%C3%B1o/'.
Как quote(), но также заменяет пробелы на знаки плюс, что требуется для экранирования значений HTML-форм при формировании строки запроса для URL. Знаки плюс в исходной строке экранируются, если они не включены в safe. Кроме того, значение по умолчанию для safe не равно '/'.
Пример: quote_plus('/ElNiño/') даёт '%2FEl+Ni%C3%B1o%2F'.
Заменяет управляющие последовательности %xx на соответствующий одиночный символ. Необязательные параметры encoding и errors задают способ декодирования процентно-кодированных последовательностей в символы Unicode, как это принимается методом bytes.decode().
string может быть либо объектом str, либо объектом bytes.
Значение encoding по умолчанию – 'utf-8'. Значение errors по умолчанию – 'replace', что означает, что недопустимые последовательности заменяются символом-заполнителем.
Пример: unquote('/El%20Ni%C3%B1o/') даёт '/ElNiño/'.
Изменено в версии 3.9: Параметр string теперь поддерживает объекты bytes и str (ранее только str).
Преобразует объект отображения (mapping) или последовательность кортежей из двух элементов, которые могут содержать объекты 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.
Устарело с версии 3.14: Приём объектов с ложными значениями (например, 0 и []), за исключением пустых строк, байтоподобных объектов и None, теперь считается устаревшим.
Это текущий стандарт (STD66). Любые изменения в модуле urllib.parse должны ему соответствовать. Могут наблюдаться некоторые отклонения, которые в основном обусловлены обратной совместимостью и некоторыми фактическими требованиями парсинга, обычно встречающимися в основных браузерах.
Этот документ (RFC) включает правила объединения абсолютного и относительного URL, включая значительное количество «Аномальных примеров», которые определяют обработку граничных случаев.