Ho due URL:
url1 = "http://127.0.0.1/test1/test2/test3/test5.xml"
url2 = "../../test4/test6.xml"
Come posso ottenere un URL assoluto per url2?
Ho due URL:
url1 = "http://127.0.0.1/test1/test2/test3/test5.xml"
url2 = "../../test4/test6.xml"
Come posso ottenere un URL assoluto per url2?
Risposte:
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'
urljoinparametri 3 o mode o quale libreria mi consigliate per questo?
/inizio verrà "resettato" e restituirà schema + 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')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?
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
es = ['http://127.0.0.1', 'test1', 'test4', 'test6.xml']
base = ''
map(lambda e: urlparse.urljoin(base, e), es)
reduce(lambda a, b: urlparse.urljoin(a, b), es) Una mappa è list[n] - to -> list[n]Una riduzione èlist[n] - to -> a calculated value
>>> from urlparse import urljoin
>>> url1 = "http://www.youtube.com/user/khanacademy"
>>> url2 = "/user/khanacademy"
>>> urljoin(url1, url2)
'http://www.youtube.com/user/khanacademy'
Semplice.
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.