2016-03-23 4 views
1

Я пытаюсь создать URL-адрес, объединив некоторые динамические компоненты. Я думал использовать что-то вроде os.path.join() НО для URL-адресов в моем случае. Из исследования, которое я нашел, urlparse.urljoin() делает то же самое. Тем не менее, похоже, что он принимает только два аргумента за один раз.Python: объединение нескольких компонентов для создания URL-адреса

У меня есть следующие до сих пор, который работает, но выглядит повторы:

a = urlparse.urljoin(environment, schedule_uri) 
    b = urlparse.urljoin(a, str(events_to_hours)) 
    c = urlparse.urljoin(b, str(events_from_date)) 
    d = urlparse.urljoin(c, str(api_version)) 
    e = urlparse.urljoin(d, str(id)) 
    url = e + '.json' 

Выход = http://example.com/schedule/12/20160322/v1/1.json

указанных работ, и я попытался сделать его короче этот путь:

url_join_items = [environment, schedule_uri, str(events_to_hours), 
        str(events_from_date), str(api_version), str(id), ".json"] 
new_url = "" 
for url_items in url_join_items: 
    new_url = urlparse.urljoin(new_url, url_items) 

Выход: http://example.com/schedule/.json

Но seco nd не работает. Пожалуйста, предложите мне, как исправить этот или лучший способ сделать это.

EDIT 1: Выход из reduce решения выглядит следующим образом (к сожалению): Выход: http://example.com/schedule/.json

+0

@idjaw: В моем случае я уже уверен, что хочу использовать 'urlparse', мне просто нужен более чистый и более короткий способ соединения более двух компонентов с одним и тем же адресом – summerNight

+1

Почему это не работает? Мне кажется, что это очень хорошо. Какой результат и что с ним не так? Вероятно, вы захотите придерживаться строковой конкатенации для '.json', чтобы ваш URL-адрес не заканчивался на'/.json'. Кроме того, я не знаю, как это будет обрабатывать пустую строку, поэтому вы можете начать с 'new_url = url_join_items [0]', а затем перебрать 'url_join_items [1:] '. Но ответ с сокращением, вероятно, лучше. –

+0

@AlexHall: Пожалуйста, см. Мой EDIT 1 и Вывод по каждому методу – summerNight

ответ

3

Использование присоединиться

Вы пробовали просто "/".join(url_join_items). Разве http не всегда использует косую черту? Возможно, вам придется вручную настроить префикс «https: //» и суффикс.

Что-то вроде:

url = "https://{}.json".format("/".join(url_join_items)) 

Использование сокращения и urljoin

Вот это related question на SO, что объясняет в какой-то степени Доводы реализации urljoin. Ваш вариант использования, по-видимому, не подходит.

При использовании reduce и urljoin я не уверен, что он будет делать то, что задает вопрос, который семантически подобен os.path.join, но для URL-адресов.Рассмотрим следующий пример:

from urllib.parse import urljoin 
from functools import reduce 

parts_1 = ["a","b","c","d"] 
parts_2 = ["https://","server.com","somedir","somefile.json"] 
parts_3 = ["https://","server.com/","somedir/","somefile.json"] 

out1 = reduce(urljoin, parts_1) 
print(out1) 

д

out2 = reduce(urljoin, parts_2) 
print(out2) 

https:///somefile.json

out3 = reduce(urljoin, parts_3) 
print(out3) 

https:///server.com/somedir/somefile.json

Обратите внимание, что за исключением дополнительные «/» после того, как префикс HTTPS, третий выход, вероятно, ближе всего к тому, что спрашивающий намерен, кроме нас» вам пришлось выполнять всю работу по форматированию деталей с помощью разделителя.

+0

Как вы думаете, это чище чем я уже работал? – summerNight

+0

Да, я думаю, что это так, но это субъективно. – svohara

4

Как насчет url = reduce(urlparse.urljoin, url_join_items)?

+1

Это 'functools.reduce' для Python 3. –

+0

Это привело к тому же результату, что и итерация списка, которую я сделал выше :( – summerNight

+0

Вы пытались удалить« .json »из списка и добавить его к url ​​напрямую, сохраняя при этом сокращение? –