Ich habe zwei URLs:
url1 = "http://127.0.0.1/test1/test2/test3/test5.xml"
url2 = "../../test4/test6.xml"
Wie kann ich eine absolute URL für url2 erhalten?
Ich habe zwei URLs:
url1 = "http://127.0.0.1/test1/test2/test3/test5.xml"
url2 = "../../test4/test6.xml"
Wie kann ich eine absolute URL für url2 erhalten?
Antworten:
Sie sollten urlparse.urljoin verwenden :
>>> import urlparse
>>> urlparse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'
Mit Python 3 (wobei urlparse in urllib.parse umbenannt wird ) können Sie es wie folgt verwenden :
>>> import urllib.parse
>>> urllib.parse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'
urljoinmit 3 oder Modus-Parametern oder welche Bibliothek empfehlen Sie dafür?
/"zurückgesetzt" und Schema + netloc + lasturl zurückgegeben wird:urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
urljoin('http://www.a.com/', '../../b/c.png')ist das Ergebnis 'http://www.a.com/../../b/c.png', aber nicht http://www.a.com/b/c.png. Gibt es also eine Methode, um sie zu bekommen http://www.a.com/b/c.png?
Wenn Ihr relativer Pfad aus mehreren Teilen besteht, müssen Sie diese separat verbinden, da urljoindies den relativen Pfad ersetzen und nicht verbinden würde. Der einfachste Weg, dies zu tun, ist zu verwenden 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'
Siehe auch: So verbinden Sie Komponenten eines Pfads, wenn Sie eine URL in Python erstellen
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) Eine Karte ist list[n] - to -> list[n]A reduzieren istlist[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'
Einfach.
Sie können verwenden reduce, um Shikhars Methode sauberer zu erreichen.
>>> import urllib.parse
>>> from functools import reduce
>>> reduce(urllib.parse.urljoin, ["http://moc.com/", "path1/", "path2/", "path3/"])
'http://moc.com/path1/path2/path3/'
Beachten Sie, dass bei dieser Methode jedes Fragment einen abschließenden Schrägstrich ohne führenden Schrägstrich haben sollte (um anzuzeigen, dass es sich um ein Pfadfragment handelt, das verbunden wird). Dies ist korrekter / informativer und zeigt an, dass path1/es sich um ein URI-Pfadfragment handelt und nicht um den vollständigen Pfad /path1/oder einen unbekannten Pfad path1, der entweder sein könnte (und als vollständiger Pfad behandelt wird).
Wenn Sie /einem fehlenden Fragment hinzufügen müssen , können Sie Folgendes tun:
uri = uri if uri.endswith("/") else f"{uri}/"
Um mehr über die URI-Auflösung zu erfahren, hat Wikipedia einige schöne Beispiele.
aktualisieren
Ich habe nur bemerkt, dass Peter Perron Shikhars Antwort reduziert hat, aber ich werde dies hier lassen, um zu demonstrieren, wie das gemacht wird.