import urllib.parse
urllib.parse.urlunsplit(parts)
parts
- части URL-адресаФункция urlunsplit()
модуля urllib.parse
создает полный URL-адрес в виде строки путем объединения элементов кортежа, возвращаемого функцией urllib.parse.urlsplit()
.
Аргумент parts
может быть любой последовательностью из пяти элементов, которая поддерживает итерацию.
Результат работы функции urllib.parse.urlunsplit()
может привести к немного отличающемуся, но эквивалентному URL-адресу, если URL-адрес, проанализированный изначально, имел ненужные разделители (например, '?'
с пустыми параметрами).
urllib.parse.urlunsplit()
:Для примера соберем из отдельных компонентов строку URL:
'https://docs-python.ru/search/?text=isinstance&web=0'
.
В документации сказано, что функция поддерживает любую последовательность из пяти элементов, которая поддерживает итерацию. Следовательно для этой цели подойдет список.
Для начала получим нужный список с пятью элементами. Так как начальное значение URL всегда известно, то будем получать список при помощи функции urllib.parse.urlsplit()
.
>>> import urllib.parse
>>> base_url = 'https://docs-python.ru/'
>>> url_parts = list(urllib.parse.urlsplit(base_url))
>>> url_parts
# ['https', 'docs-python.ru', '/', '', '']
Такие параметры URL как text=isinstance&web=0
нужно как то собрать и передать в список по индексу base_url[3]
. Для этих целей есть функция urllib.parse.urlencode()
, которая закодирует и соберет правильным образом параметры запроса, представленные в качестве словаря.
>>> import urllib.parse
>>> args = {'text'='isinstance', 'web'=0}
>>> query = urllib.parse.urlencode(args)
>>> query
# 'text=isinstance&web=0'
Теперь осталось все компоненты URL передать в список и собрать URL-адрес при помощи функции urllib.parse.urlunsplit()
.
# получено выше
>>> url_parts = ['https', 'docs-python.ru', '/', '', '']
>>> path = '/search/'
# получено выше
>>> query = 'text=isinstance&web=0'
# Добавляем компоненты в список
>>> url_parts[2] = path
>>> url_parts[3] = query
>>> url_parts
# ['https', 'docs-python.ru', '/search/', 'text=isinstance&web=0', '']
# подставляем список в качестве аргумента в функцию
>>> urllib.parse.urlunsplit(url_parts)
# 'https://docs-python.ru/search/?text=isinstance&web=0'
Теперь оформим вышесказанное в функцию build_url()
, которая будет строить URL-адреса из отдельных компонентов.
>>> import urllib.parse
>>> def build_url(base_url, path, query_dict=None, anchor=None):
... url_parts = list(urllib.parse.urlsplit(base_url))
... url_parts[2] = path
... url_parts[3] = urllib.parse.urlencode(query_dict) if query_dict ``
... url_parts[4] = anchor if anchor ''
... return urllib.parse.urlunsplit(url_parts)
...
>>> query_dict = {'text': 'isinstance', 'web': '0'}
# работает со сценарием двойной косой черты
>>> build_url('https://docs-python.ru/', '/search/', query_dict)
# 'https://docs-python.ru/search/?text=isinstance&web=0'
# работает без косой черты
>>> build_url('https://docs-python.ru', 'search/', query_dict)
# 'https://docs-python.ru/search/?text=isinstance&web=0'
Для полноценности, в этой функции построения URL-адреса из отдельных компонентов необходимо предусмотреть проверку передаваемых типов.