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 | Значение если его нет |
scheme | 0 | Протокол | Аргумент 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-адрес будет разложен перед синтаксическим анализом, то ошибка не возникнет.Как и в случае со всеми именованными кортежами, у подкласса есть несколько дополнительных методов и атрибутов, которые особенно полезны. Один из таких методов - 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='')
Примечание:
ValueError
, а не возвращают None
.netloc
при нормализации NFKC, теперь будут вызывать ValueError
.