Вопрос или проблема
Многие языки имеют стандартные API для построения и разбора URL из частей, таких как схема, хост, порт, параметр запроса. Некоторые позволяют начать с базового URL и добавлять пути.
Как это сделать в Python, используя стандартную библиотеку?
Например, как мне построить URL:
http://subdomain.domain.com?arg1=someargument&arg2=someotherargument
если у меня есть базовый URL "http://subdomain.domain.com"
и несколько параметров запроса. Или если задана схема: "http"
, хост "subdomain.domain.com"
и т.д.?
Я бы использовал urllib
в Python, это встроенная библиотека.
Python 2
import urllib
url="https://example.com/somepage/?"
params = {'var1': 'some data', 'var2': 1337}
print(url + urllib.urlencode(params))
Python 3
import urllib.parse
url="https://example.com/somepage/?"
params = {'var1': 'some data', 'var2': 1337}
print(url + urllib.parse.urlencode(params))
Вывод:
https://example.com/somepage/?var1=some+data&var2=1337
urlparse
в стандартной библиотеке Python предназначен для построения корректных URL. Ознакомьтесь с документацией urlparse
Пример:
from collections import namedtuple
from urllib.parse import urljoin, urlencode, urlparse, urlunparse
# namedtuple для сопоставления с внутренней сигнатурой urlunparse
Components = namedtuple(
typename="Components",
field_names=['scheme', 'netloc', 'url', 'path', 'query', 'fragment']
)
query_params = {
'param1': 'some data',
'param2': 42
}
url = urlunparse(
Components(
scheme="https",
netloc="example.com",
query=urlencode(query_params),
path="",
url="https://stackoverflow.com/",
fragment="anchor"
)
)
print(url)
Вывод:
https://example.com/?param1=some+data¶m2=42#anchor
Вот пример использования urlparse
для генерации URL. Это удобно, потому что позволяет добавлять пути к URL, не беспокоясь о проверке слешей.
import urllib.parse
def build_url(base_url, path, args_dict):
# Возвращает список в структуре urlparse.ParseResult
url_parts = list(urllib.parse.urlparse(base_url))
url_parts[2] = path
url_parts[4] = urllib.parse.urlencode(args_dict)
return urllib.parse.urlunparse(url_parts)
>>> args = {'arg1': 'value1', 'arg2': 'value2'}
>>> # работает со сценарием двойного слэша
>>> build_url('http://www.example.com/', '/somepage/index.html', args)
http://www.example.com/somepage/index.html?arg1=value1&arg2=value2
# работает без слэша
>>> build_url('http://www.example.com', 'somepage/index.html', args)
http://www.example.com/somepage/index.html?arg1=value1&arg2=value2
используется предложение Марка Джонсона для обновления, urlencode() теперь в urllib.parse, добавлено удаление завершающего /
from urllib.parse import urlencode
def make_url(base_url, *uris, **params):
url = base_url.rstrip("https://stackoverflow.com/")
for uri in uris:
_uri = uri.strip("https://stackoverflow.com/")
url="{}/{}".format(url, _uri) if _uri else url
if params:
url="{}?{}".format(url, urlencode(params))
return url
Использование:
>>>print(make_url('http://example.com', 'user', 'ivan', alcoholic="true", age=18))
http://example.com/user/ivan?age=18&alcoholic=true
>>>print(make_url('https://example.com/', "https://stackoverflow.com/", '/one/two/', "https://stackoverflow.com/", 'three/'))
https://example.com/one/two/three
Я хотел построить корректный URL из домена и маршрутов, и urllib.parse.urljoin
был подходящим решением
from urllib.parse import urljoin
url1='https://www.imf.org/'
url2='/landing/page'
urljoin(url1,url2)
# 'https://www.imf.org/landing/page'
Ответ или решение
Как создать URL в Python с использованием стандартной библиотеки
Создание и разбор URL в Python можно удобно выполнить с использованием модуля urllib
, который является частью стандартной библиотеки. Этот модуль предлагает несколько полезных функций, которые позволяют строить, манипулировать и обрабатывать URL-адреса, без необходимости привлекать сторонние библиотеки.
Основные компоненты URL
URL состоит из нескольких компонентов:
- scheme: Протокол (например, http, https, ftp).
- netloc: Сетевое расположение (например, subdomain.domain.com).
- path: Путь к ресурсу (например, /somepath).
- params: Параметры (обычно не используется в современных URL).
- query: Дополнительные параметры запроса (например, аргументы в строке запроса).
- fragment: Фрагмент, указывающий на часть страницы (например, #section).
Пример использования urllib.parse
В Python 3 модуль urllib.parse
предоставляет средства для работы с URL. Вот как можно создать URL на основе базового URL и параметров запроса:
from urllib.parse import urlencode, urljoin, urlparse, urlunparse
# Функция для сборки URL
def build_url(base_url, path="", params=None):
if params is None:
params = {}
# Составляем URL
full_path = urljoin(base_url, path)
query_string = urlencode(params)
complete_url = f"{full_path}?{query_string}" if query_string else full_path
return complete_url
# Пример использования
base_url = "http://subdomain.domain.com"
path = "somepage/index.html"
query_params = {'arg1': 'someargument', 'arg2': 'someotherargument'}
url = build_url(base_url, path, query_params)
print(url)
Вывод
http://subdomain.domain.com/somepage/index.html?arg1=someargument&arg2=someotherargument
Использование urlparse
для разбора URL
Функция urlparse
позволяет разбивать существующий URL на его компоненты:
from urllib.parse import urlparse
# Разбор URL
url = "http://subdomain.domain.com/somepage/index.html?arg1=someargument&arg2=someotherargument"
parsed_url = urlparse(url)
print(parsed_url.scheme) # http
print(parsed_url.netloc) # subdomain.domain.com
print(parsed_url.path) # /somepage/index.html
print(parsed_url.query) # arg1=someargument&arg2=someotherargument
Построение сложных URL
Вы также можете использовать urlunparse
и именованные кортежи для создания более сложных URL. Вот пример:
from collections import namedtuple
# Определяем кортеж компонентов URL
Components = namedtuple('Components', ['scheme', 'netloc', 'path', 'params', 'query', 'fragment'])
query_params = {'param1': 'some data', 'param2': 42}
complete_url = urlunparse(
Components(
scheme="https",
netloc="example.com",
path="/",
params="",
query=urlencode(query_params),
fragment="anchor"
)
)
print(complete_url)
Вывод
https://example.com/?param1=some+data¶m2=42#anchor
Заключение
В Python стандартная библиотека urllib
предлагает мощные инструменты для работы с URL. С помощью функций urlencode
, urljoin
, urlparse
и urlunparse
можно легко создавать и обрабатывать URL, что делает их весьма полезными в разработке веб-приложений и для сетевого взаимодействия. Пользуясь этими функциями, вы можете быть уверены, что формируемые вами URL будут корректными и полностью соответствовать необходимым стандартам.