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.
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
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.
Antworten:
Sie sollten urlparse.urljoin verwenden :
Mit Python 3 (wobei urlparse in urllib.parse umbenannt wird ) können Sie es wie folgt verwenden :
quelle
urljoin
mit 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 nichthttp://www.a.com/b/c.png
. Gibt es also eine Methode, um sie zu bekommenhttp://www.a.com/b/c.png
?Wenn Ihr relativer Pfad aus mehreren Teilen besteht, müssen Sie diese separat verbinden, da
urljoin
dies den relativen Pfad ersetzen und nicht verbinden würde. Der einfachste Weg, dies zu tun, ist zu verwendenposixpath
.Siehe auch: So verbinden Sie Komponenten eines Pfads, wenn Sie eine URL in Python erstellen
quelle
quelle
reduce(lambda a, b: urlparse.urljoin(a, b), es)
Eine Karte istlist[n] - to -> list[n]
A reduzieren istlist[n] - to -> a calculated value
Einfach.
quelle
Für Python 3.0+ ist der richtige Weg, um URLs zu verbinden:
quelle
Sie können verwenden
reduce
, um Shikhars Methode sauberer zu erreichen.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 Pfadpath1
, 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: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.
quelle