Come unire URL assoluti e relativi?


Risposte:


214

Dovresti usare urlparse.urljoin :

>>> import urlparse
>>> urlparse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'

Con Python 3 (dove urlparse è rinominato urllib.parse ) potresti usarlo come segue :

>>> import urllib.parse
>>> urllib.parse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'

5
Come usiamo i urljoinparametri 3 o mode o quale libreria mi consigliate per questo?
Mesut Tasci

@mesuutt cerca di creare un loop e unire ogni parte con l'URL precedentemente unito.
Cédric Julien

2
@ CédricJulien: un semplice loop non funzionerà, poiché qualsiasi percorso con un /inizio verrà "resettato" e restituirà schema + netloc + lasturl:urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
MestreLion

Se si utilizza l'urljoin, c'è un problema. Ad esempio, urljoin('http://www.a.com/', '../../b/c.png')il risultato è 'http://www.a.com/../../b/c.png', ma non http://www.a.com/b/c.png. Quindi, esiste un metodo per ottenerlo http://www.a.com/b/c.png?
bigwind

1
Il collegamento alla documentazione di Python 3 punta alla documentazione di Python 2, deve essere aggiornato nella risposta, è docs.python.org/3.6/library/…
Duro

8

Se il tuo percorso relativo è composto da più parti, devi unirle separatamente, poiché urljoinsostituirebbe il percorso relativo, non unirle. Il modo più semplice per farlo è usare posixpath.

>>> import urllib.parse
>>> import posixpath
>>> url1 = "http://127.0.0.1"
>>> url2 = "test1"
>>> url3 = "test2"
>>> url4 = "test3"
>>> url5 = "test5.xml"
>>> url_path = posixpath.join(url2, url3, url4, url5)
>>> urllib.parse.urljoin(url1, url_path)
'http://127.0.0.1/test1/test2/test3/test5.xml'

Vedi anche: Come unire i componenti di un percorso quando stai costruendo un URL in Python


7
es = ['http://127.0.0.1', 'test1', 'test4', 'test6.xml']
base = ''
map(lambda e: urlparse.urljoin(base, e), es)

3
Buon modo per supportare un elenco di valori. Puoi rimuovere il tuo effetto collaterale (la tua variabile "base") usando una riduzione. reduce(lambda a, b: urlparse.urljoin(a, b), es) Una mappa è list[n] - to -> list[n]Una riduzione èlist[n] - to -> a calculated value
Peter Perron

4
>>> from urlparse import urljoin
>>> url1 = "http://www.youtube.com/user/khanacademy"
>>> url2 = "/user/khanacademy"
>>> urljoin(url1, url2)
'http://www.youtube.com/user/khanacademy'

Semplice.


3

Per python 3.0+ il modo corretto per unire gli URL è:

from urllib.parse import urljoin
urljoin('https://10.66.0.200/', '/api/org')
# output : 'https://10.66.0.200/api/org'

1

Puoi usarlo reduceper ottenere il metodo di Shikhar in modo più pulito.

>>> import urllib.parse
>>> from functools import reduce
>>> reduce(urllib.parse.urljoin, ["http://moc.com/", "path1/", "path2/", "path3/"])
'http://moc.com/path1/path2/path3/'

Si noti che con questo metodo, ogni frammento dovrebbe avere una barra in avanti finale, senza una barra in avanti iniziale (per indicare che è un frammento di percorso che viene unito). Questo è più corretto / informativo, ti dice che path1/è un frammento di percorso URI e non il percorso completo /path1/o uno sconosciuto path1, che potrebbe essere (e viene trattato come un percorso completo).

Se devi aggiungere /un frammento a cui manca, potresti fare:

uri = uri if uri.endswith("/") else f"{uri}/"

Per saperne di più sulla risoluzione degli URI, Wikipedia ha alcuni bei esempi.

aggiornare

Noti solo che Peter Perron ha commentato la riduzione sulla risposta di Shikhar, ma lo lascerò qui per dimostrare come è stato fatto.

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.