Функция urlparse из модуля urllib.parse разбирает URL на составные части: протокол, имя хоста, порт, путь, запрос и прочие.

>>> u1 = urlparse('https://tirinox:1234@www.site.com:8080/some/page/index.html?page=2&action=login') >>> u1 ParseResult(scheme='https', netloc='tirinox:1234@www.site.com:8080', path='/some/page/index.html', params='', query='page=2&action=login', fragment='') >>> u1.scheme, u1.query, u1.netloc ('https', 'page=2&action=login', 'tirinox:1234@www.site.com:8080')
Имя хоста, порт, логин и пароль объединены в поле netloc, но их компоненты доступны для чтения по этим атрибутам:
>>> u1.username, u1.password, u1.hostname, u1.port ('tirinox', '1234', 'www.site.com', 8080)
Собрать обратно ParseResult
в URL:
>>> u1.geturl() 'https://www.site.com:8080/some/page/index.html?page=2&action=login'
Если мы хотим в URL поменять какие-то части, удобно делать вот так:
>>> u1._replace(scheme='http').geturl() 'http://www.site.com:8080/some/page/index.html?page=2&action=login'
Однако таким способом нельзя поменять компоненты netloc, например, отдельно порт. netloc нужно менять целиком:
>>> u1._replace(netloc="user:password@www.site.com:8090").geturl() 'https://user:password@www.site.com:8090/some/page/index.html?page=2&action=login'
Специально для канала @pyway. Подписывайтесь на мой канал в Телеграм @pyway 👈