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

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

Разбирает URL-адрес, учитывая параметры последнего элемента пути

Синтаксис:

import urllib.parse

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

Параметры:

  • urlstring - str или bytes - URL-адрес,
  • scheme='' - схема адресации по умолчанию,
  • allow_fragments=True - что делать с анкором на страницу HTML, обнаруженном в строке с URL-адресом.

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

Описание:

Функция urlparse() модуля urllib.parse разбирает URL-адрес urlstring на *ШЕСТЬ компонентов и возвращает именованный кортеж из 6 (шести) элементов, что соответствует старой структуре URL:

scheme://netloc/path;parameters?Query#fragment.

Каждый элемент кортежа представляет собой строку, возможно, пустую. Компоненты не разбиваются на более мелкие части (например, местоположение в сети представляет собой одну строку), а переходы % не раскрываются. Указанные выше разделители не являются частью результата, за исключением ведущей косой черты в компоненте пути, которая сохраняется, если присутствует. Например:

>>> from urllib.parse import urlparse
>>> url = urlparse('https://docs-python.ru:80/search/')
>>> url
# ParseResult(scheme='https', netloc='docs-python.ru:80', path='/search/',
#             params='', query='', fragment='')
>>> url.scheme
# 'https'
>>> url.port
# 80
>>> url.geturl()
# 'http://docs-python.ru:80/search/'

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

>>> from urllib.parse import urlparse
>>> urlparse('//docs-python.ru:80/search/')
# ParseResult(scheme='', netloc='docs-python.ru:80', path='/search/',
#             params='', query='', fragment='')
>>> urlparse('docs-python.ru/search/')
# ParseResult(scheme='', netloc='', path='docs-python.ru/search/',
#             params='', query='', fragment='')
>>> urlparse('tutorial/ustanovka-python/')
# ParseResult(scheme='', netloc='', path='tutorial/ustanovka-python/', params='',
#             query='', fragment='')

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

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

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

Атрибут№ индексаValueЗначение если его нет
scheme0ПротоколАргумент scheme
netloc1Доменное имяпустая строка
path2Путьпустая строка
params3Параметры последнего элемента путипустая строка
query4Компонент запросапустая строка
fragment5Идентификатор фрагментапустая строка
usernameИмя пользователяNone
passwordПарольNone
hostnameИмя хоста в нижнем регистреNone
portНомер порта в виде целого числа, если он присутствуетNone
  • Чтение атрибута port вызовет исключение ValueError, если в URL-адресе указан недопустимый порт.
  • Несогласованные квадратные скобки в атрибуте netloc вызовут ошибку ValueError.
  • Символы в атрибуте netloc, которые разбираются при нормализации NFKC (как используется кодировкой IDNA) на любой из '/', '?', '#', '@' или ':', вызовут ValueError. Если URL-адрес будет разложен перед синтаксическим анализом, то ошибка не возникнет.

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

>>> from urllib.parse import urlparse
>>> url = urlparse('//docs-python.ru:80/search/')
>>> url
# ParseResult(scheme='', netloc='docs-python.ru:80', path='/search/',
#             params='', query='', fragment='')
>>> url._replace(scheme='https')
# ParseResult(scheme='https', netloc='docs-python.ru:80', path='/search/',
#             params='', query='', fragment='')

Примечание:

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