Wie verbinde ich absolute und relative URLs?

Antworten:

212

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'
Cédric Julien
quelle
5
Wie verwenden wir urljoinmit 3 oder Modus-Parametern oder welche Bibliothek empfehlen Sie dafür?
Mesut Tasci
@mesuutt versuche eine Schleife zu erstellen und verbinde jeden Teil mit der zuvor verbundenen URL.
Cédric Julien
2
@ CédricJulien: Eine einfache Schleife funktioniert nicht, da jeder Pfad mit einem führenden /"zurückgesetzt" und Schema + netloc + lasturl zurückgegeben wird:urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
MestreLion
Wenn Sie die URL verwenden, liegt ein Problem vor. Zum Beispiel 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?
Bigwind
1
Der Link zur Python 3-Dokumentation verweist auf die Python 2-Dokumentation. Sie muss in der Antwort aktualisiert werden. Sie lautet docs.python.org/3.6/library/…
Harsh
8

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

pcv
quelle
7
es = ['http://127.0.0.1', 'test1', 'test4', 'test6.xml']
base = ''
map(lambda e: urlparse.urljoin(base, e), es)
Shikhar Mall
quelle
3
Gute Möglichkeit, eine Liste von Werten zu unterstützen. Sie können Ihren Nebeneffekt (Ihre "Basis" -Variable) entfernen, indem Sie eine Reduzierung verwenden. 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
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'

Einfach.

Talha Ashraf
quelle
3

Für Python 3.0+ ist der richtige Weg, um URLs zu verbinden:

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

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.

Ryanjdillon
quelle