#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
которые лучше подходят.