Как строить URL-адреса в Python с помощью стандартной библиотеки?

Вопрос или проблема

Многие языки имеют стандартные 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&param2=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&param2=42#anchor

Заключение

В Python стандартная библиотека urllib предлагает мощные инструменты для работы с URL. С помощью функций urlencode, urljoin, urlparse и urlunparse можно легко создавать и обрабатывать URL, что делает их весьма полезными в разработке веб-приложений и для сетевого взаимодействия. Пользуясь этими функциями, вы можете быть уверены, что формируемые вами URL будут корректными и полностью соответствовать необходимым стандартам.

Оцените материал
Добавить комментарий

Капча загружается...