Объединение трех компонентов URL в один URL

#python #url

#python #url

Вопрос:

Я пытаюсь написать функцию, объединяющую три компонента URL-адреса: протокол, местоположение и ресурс, в один URL-адрес.

У меня есть следующий код, и он работает только частично, возвращая URL только с компонентами протокола и ресурса, но не с компонентом местоположения.

Код:

 from urllib.parse import urlparse
import os
def buildURL(protocol, location, resource):
    return urllib.parse.urljoin(protocol, os.path.join(location, 
    resource))

Example: buildURL('http://', 'httpbin.org', '/get')
  

Это возвращает http:///get . Я пытаюсь отладить это, чтобы также разрешить наличие параметра location в URL. Он должен возвращаться http://httpbin.org/get .

Как я могу успешно создать URL-адрес?

Ответ №1:

Это потому, что вы помещаете /get в os.path.join . вы должны называть это как buildURL('http://', 'httpbin.org', 'get') . os.path.join будет обрабатываться / как абсолютный путь, который будет подключен из корня базового местоположения, которое является первым параметром join функции: location

Комментарии:

1. Спасибо. Это работает без / перед get . Однако, есть ли способ написать код, который все равно будет объединять три, даже если третий параметр равен / get? Я пытаюсь написать функцию, которая будет работать, даже если перед текстом стоит /. Спасибо.

2. @JakePrice resource[1:] if resource[0] == '/' else resource

3. @JakePrice Я думаю, что ответ Криса лучше.

4. Хорошо, я думал, что это сработало, но, к сожалению, этого не произошло. Я пытаюсь работать с ответом @ Chris

Ответ №2:

Вы вообще не должны использовать os.path здесь. Этот модуль предназначен для путей к файловой системе, например, для работы с такими вещами, как /usr/bin/bash и C:Documents and SettingsUser .

Это не для создания URL-адресов. На них не влияет операционная система пользователя.

Вместо этого используйте urlunparse() или urlunsplit() из urllib.parse :

 from urllib.parse import urlunparse

urlunparse(('https', 'httpbin.org', '/get', None, None, None))
# 'https://httpbin.org/get'
  

Комментарии:

1. Всем привет, спасибо за вашу помощь, это очень помогает. Однако это не работает, когда первым аргументом является ‘http: //’ вместо просто ‘https’. Есть ли способ настроить это так, чтобы оно все еще работало, когда к первому параметру уже прикреплен ://? Например, для этой функции: из urllib.parse импортируйте urlunparse def buildURL(протокол, местоположение, ресурс): верните urlunparse((протокол, местоположение, ресурс, Нет, None, None)) buildURL(‘http://’, ‘httpbin.org ‘, ‘/get’), чтобы все еще работать

2. Лучший способ — просто передать https часть. Почему вы хотите включить :// в свой ввод? Это происходит откуда-то еще? (Модуль следует RFC 3986 , где «схема» выглядит примерно так https , и она отделена от «полномочий» символом :// .)

3. Здравствуйте, я просто пытаюсь написать функцию, которая работает для любого из следующих вводимых первых аргументов: ‘http: //’, ‘http’ и ‘https’. Я пытался понять, как функция все еще может быть работоспособной с ‘http: //’ в качестве первого аргумента в функции. Спасибо.

4. Ваше предложение работает действительно хорошо, я просто хотел посмотреть, есть ли способ настроить его так, чтобы ‘http: //’ также мог работать с ним. Может быть, оператор if?

5. @JakePrice, не стесняйтесь проверять этот аргумент, например, с помощью str.endswith() и изменять его при необходимости. Вы также могли бы использовать регулярное выражение, убрать пробелы, нормализовать регистр и т.д. если вы хотите. Суть в том, что os.path это неподходящий модуль для создания URL-адресов, и что в нем есть две функции, urllib.parse которые лучше подходят.