Comment utilisons-nous urljoinavec 3 paramètres ou mode ou quelle bibliothèque recommandez-vous pour cela?
Mesut Tasci
@mesuutt essaie de faire une boucle et de joindre chaque partie avec l'URL précédemment jointe.
Cédric Julien
2
@ CédricJulien: une simple boucle ne fonctionnera pas, car tout chemin avec un /début sera "réinitialisé" et retournera schéma + netloc + lasturl:urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
MestreLion
Si vous utilisez l'urljoin, il y a un problème. Par exemple urljoin('http://www.a.com/', '../../b/c.png'),, le résultat est 'http://www.a.com/../../b/c.png', mais pas http://www.a.com/b/c.png. Alors, y a-t-il une méthode pour obtenir http://www.a.com/b/c.png?
bigwind
1
Le lien vers la documentation Python 3 pointe vers la documentation Python 2, il doit être mis à jour dans la réponse, il s'agit de docs.python.org/3.6/library
Harsh
8
Si votre chemin relatif se compose de plusieurs parties, vous devez les joindre séparément, car urljoincela remplacerait le chemin relatif, pas le rejoindre. Le moyen le plus simple de le faire est d'utiliser posixpath.
Bon moyen de soutenir une liste de valeurs. Vous pouvez cependant supprimer votre effet secondaire (votre variable «de base») en utilisant une réduction. reduce(lambda a, b: urlparse.urljoin(a, b), es) Une carte est list[n] - to -> list[n]une réduction estlist[n] - to -> a calculated value
Notez qu'avec cette méthode, chaque fragment doit avoir une barre oblique de fin, sans barre oblique de début (pour indiquer qu'il s'agit d'un fragment de chemin joint). Ceci est plus correct / informatif, vous indiquant qu'il path1/s'agit d'un fragment de chemin URI, et non du chemin complet /path1/ou d'un inconnu path1, qui pourrait être l'un ou l'autre (et est traité comme un chemin complet).
Si vous avez besoin d'ajouter /à un fragment qui en manque, vous pouvez faire:
uri = uri if uri.endswith("/")else f"{uri}/"
Pour en savoir plus sur la résolution d'URI, Wikipédia a quelques bons exemples.
mettre à jour
Remarques juste que Peter Perron a commenté réduire la réponse de Shikhar, mais je laisserai ceci ici pour montrer comment cela se fait.
Réponses:
Vous devez utiliser urlparse.urljoin :
Avec Python 3 (où urlparse est renommé en urllib.parse ), vous pouvez l' utiliser comme suit :
la source
urljoin
avec 3 paramètres ou mode ou quelle bibliothèque recommandez-vous pour cela?/
début sera "réinitialisé" et retournera schéma + netloc + lasturl:urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
urljoin('http://www.a.com/', '../../b/c.png')
,, le résultat est'http://www.a.com/../../b/c.png'
, mais pashttp://www.a.com/b/c.png
. Alors, y a-t-il une méthode pour obtenirhttp://www.a.com/b/c.png
?Si votre chemin relatif se compose de plusieurs parties, vous devez les joindre séparément, car
urljoin
cela remplacerait le chemin relatif, pas le rejoindre. Le moyen le plus simple de le faire est d'utiliserposixpath
.Voir aussi: Comment joindre les composants d'un chemin lorsque vous construisez une URL en Python
la source
la source
reduce(lambda a, b: urlparse.urljoin(a, b), es)
Une carte estlist[n] - to -> list[n]
une réduction estlist[n] - to -> a calculated value
Facile.
la source
Pour python 3.0+, la bonne façon de joindre des URL est:
la source
Vous pouvez utiliser
reduce
pour réaliser la méthode de Shikhar d'une manière plus propre.Notez qu'avec cette méthode, chaque fragment doit avoir une barre oblique de fin, sans barre oblique de début (pour indiquer qu'il s'agit d'un fragment de chemin joint). Ceci est plus correct / informatif, vous indiquant qu'il
path1/
s'agit d'un fragment de chemin URI, et non du chemin complet/path1/
ou d'un inconnupath1
, qui pourrait être l'un ou l'autre (et est traité comme un chemin complet).Si vous avez besoin d'ajouter
/
à un fragment qui en manque, vous pouvez faire:Pour en savoir plus sur la résolution d'URI, Wikipédia a quelques bons exemples.
mettre à jour
Remarques juste que Peter Perron a commenté réduire la réponse de Shikhar, mais je laisserai ceci ici pour montrer comment cela se fait.
la source