2016-03-23 3 views
1

J'essaye de créer une URL en joignant certains composants dynamiques. J'ai pensé à utiliser quelque chose comme os.path.join() MAIS pour les URL dans mon cas. De la recherche, j'ai trouvé urlparse.urljoin() fait la même chose. Cependant, il semble que cela ne prenne que deux arguments en même temps.Python: joindre plusieurs composants pour créer une URL

Je donne les résultats suivants à ce jour qui fonctionne, mais semble répétitif:

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' 

Sortie = http://example.com/schedule/12/20160322/v1/1.json

Les travaux ci-dessus et j'essayé de le rendre plus court de cette façon:

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) 

Sortie: http://example.com/schedule/.json

Mais le seco La mise en œuvre nd ne fonctionne pas. S'il vous plaît me suggérer comment résoudre ce problème ou la meilleure façon de le faire.

EDIT 1: La sortie de la solution reduce ressemble à ceci (malheureusement): Sortie: http://example.com/schedule/.json

+0

@idjaw: Dans mon cas, je suis déjà sûr que je veux utiliser 'urlparse', j'ai juste besoin d'un moyen plus propre et plus court de joindre plus de 2 composants à la même URL – summerNight

+1

Pourquoi ça ne marche pas? Cela me semble plutôt bien. Quel est le résultat et quel est le problème? Vous voulez probablement vous en tenir à la concaténation de chaînes pour '.json' afin que votre URL ne se termine pas par'/.json'. Je ne sais pas non plus comment gérer une chaîne vide, donc vous pouvez commencer par 'new_url = url_join_items [0]' et ensuite parcourir 'url_join_items [1:]'. Mais la réponse avec réduire est probablement meilleure. –

+0

@AlexHall: S'il vous plaît voir mon EDIT 1 et sortie de chaque méthode – summerNight

Répondre

3

rejoindre Utiliser

Avez-vous essayé simplement "/".join(url_join_items). Http n'utilise-t-il pas toujours la barre oblique? Vous devrez peut-être configurer manuellement le préfixe "https: //" et le suffixe, cependant.

Quelque chose comme:

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

aide à réduire et urljoin

Voici une related question sur SO qui explique dans une certaine mesure la pensée derrière la mise en œuvre de urljoin. Votre cas d'utilisation ne semble pas être le meilleur. Lorsque vous utilisez reduce et urljoin, je ne suis pas sûr qu'il fera ce que la question a l'intention, qui est sémantiquement comme os.path.join, mais pour les URL.Considérez ce qui suit:

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) 

d

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

https:///somefile.json

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

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

Notez que, à l'exception de l'extra "/" après le préfixe https, la troisième sortie est probablement plus proche de ce que le demandeur entend, sauf que nous » J'ai dû faire tout le travail de formatage des pièces avec le séparateur.

+0

Pensez-vous que c'est un nettoyeur? approche que ce que j'ai déjà travaillé? – summerNight

+0

Oui, je pense que c'est, mais c'est subjectif. – svohara

4

Que diriez-vous url = reduce(urlparse.urljoin, url_join_items)?

+1

C'est 'functools.reduce' pour Python 3. –

+0

Cela a produit le même résultat que l'itération listée ci-dessus :( – summerNight

+0

Avez-vous essayé de supprimer" .json "de la liste et de l'ajouter directement à url, tout en gardant réduire? –