На этом шаге мы начнем знакомиться с инструментами, используемыми для выполнения этой операции.
С помощью модуля urllib.parse можно манипулировать URL-адресом - например, разобрать его на составляющие или получить абсолютный URL-адрес, указав базовый и относительный адреса. URL-адрес (его также называют интернет-адресом) состоит из следующих элементов:
<Протокол>://<Домен>:<Порт>/<Путь>;<Параметры>?<Запрос>#<Якорь>
Схема URL-адреса для протокола FTP выглядит по-другому:
<Протокол>://<Пользователь>:<Пароль>@<Домен>
Разобрать URL-адрес на составляющие позволяет функция urlparse():
urlparse (<URL-адрес>[ <Схема>[, <Разбор якоря>]])
Функция возвращает объект ParseResult с результатами разбора URL-адреса. Получить значения можно с помощью атрибутов или индексов. Объект можно преобразовать в кортеж из следующих элементов: (scheme, netloc, path, params, query, fragment). Элементы соответствуют схеме URL-адреса:
<scheme>://<netloc>/<path>;<params>?<query>#<fragment>.
Обратите внимание на то, что название домена, хранящееся в атрибуте netloc, будет содержать номер порта. Кроме того, не ко всем атрибутам объекта можно получить доступ с помощью индексов. Пример кода, разбирающего URL-адрес, приведен ниже.
>>> from urllib.parse import urlparse >>> url = urlparse("http://www.admin.ru:80/test.php;st?var=5#metka") >>> url ParseResult(scheme='http', netloc='www.admin.ru:80', path='/test.php', params='st', query='var=5', fragment='metka')
Во втором параметре функции urlparse() можно указать название протокола, которое будет использоваться, если таковой отсутствует в составе URL-адреса. По умолчанию это пустая строка. Примеры:
>>> urlparse ("//www.admin.ru/test.php") ParseResult(scheme='', netloc='www.admin.ru', path='/test.php', params='', query='', fragment='') >>> urlparse ("//www.admin.ru/test.php", "http") ParseResult(scheme='http', netloc='www.admin.ru', path='/test.php', params='', query='', fragment='')
Объект ParseResult, возвращаемый функцией urlparse(), содержит следующие атрибуты:
>>> url.scheme, url[0]
('http', 'http')
>>> url.netloc, url[1]
('www.admin.ru:80', 'www.admin.ru:80')
>>> url.hostname, url.port
('www.admin.ru', 80)
>>> url.path, url[2]
('/test.php', '/test.php')
>>> url.params, url[3]
('st', 'st')
>>> url.query, url[4]
('var=5', 'var=5')
>>> url.fragment, url[5]
('metka', 'metka')
Если третий параметр в функции urlparse() имеет значение False, то якорь будет входить в состав значения других атрибутов (обычно хранящего предыдущую часть адреса), а не fragment. По умолчанию параметр имеет значение True. Примеры:
>>> u = urlparse("http://site.ru/add.php?v=5#metka") >>> u.query, u.fragment ('v=5', 'metka') >>> u = urlparse("http://site.ru/add.php?v=5#metka", "", False) >>> u.query, u.fragment ('v=5#metka', '')
>>> ftp = urlparse("ftp://user:123456@mysite.ru") >>> ftp.scheme, ftp.hostname, ftp.username, ftp.password ('ftp', 'mysite.ru', 'user', '123456')
На следующем шаге мы закончим изучение этого вопроса.