Wie bekomme ich alles nach dem letzten Schrägstrich in einer URL?


110

Wie kann ich alles extrahieren, was auf den letzten Schrägstrich in einer URL in Python folgt? Diese URLs sollten beispielsweise Folgendes zurückgeben:

URL: http://www.test.com/TEST1
returns: TEST1

URL: http://www.test.com/page/TEST2
returns: TEST2

URL: http://www.test.com/page/page/12345
returns: 12345

Ich habe urlparse ausprobiert, aber das gibt mir den vollständigen Pfad Dateinamen, wie z page/page/12345.


1
Wenn die URL möglicherweise Querystringe wie enthält ...?foo=barund Sie dies nicht möchten; Ich würde vorschlagen, urlparsein Kombination mit Naegs basename-Vorschlag zu verwenden.
Plundra

Antworten:


243

Sie brauchen keine ausgefallenen Dinge, sehen Sie sich nur die Zeichenfolgenmethoden in der Standardbibliothek an und Sie können Ihre URL einfach zwischen dem Teil 'Dateiname' und dem Rest aufteilen:

url.rsplit('/', 1)

So können Sie den Teil, an dem Sie interessiert sind, einfach erhalten mit:

url.rsplit('/', 1)[-1]

10
url.rsplit('/', 1)Gibt eine Liste zurück und url.rsplit('/', 1)[-1]ist das Bit nach dem letzten Schrägstrich.
Hugo

5
Eine andere Möglichkeit wäre: url.rsplit ('/', 1) .pop ()
Alex Fortin

WARNUNG: Dieser grundlegende Trick bricht bei URLs wie z http://www.example.com/foo/?entry=the/bar#another/bar. Eine grundlegende Analyse wie rsplitist jedoch in Ordnung, wenn Sie absolut sicher sind, dass Ihre Abfrage- oder Fragmentparameter niemals Schrägstriche enthalten. Ich schaudere jedoch, wenn ich daran denke, wie viele Codebasen diesen rsplitCode und den damit verbundenen Fehler bei der Abfragebehandlung tatsächlich enthalten . Menschen, die ABSOLUTE SICHERHEIT UND ZUVERLÄSSIGKEIT wünschen, sollten urllib.parse()stattdessen verwenden! Sie können dann den zurückgegebenen pathWert verwenden und DIESES teilen, um sicherzustellen, dass Sie NUR den Pfad geteilt haben.
Mitch McMabers

CODE: Ein Beispiel für die Implementierung der besseren Methode: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1]) Ergebnis:foo.htm
Mitch McMabers



10

Sie können dies tun:

head, tail = os.path.split(url)

Wo Schwanz wird Ihr Dateiname sein.


6

urlparse ist in Ordnung, wenn Sie möchten (z. B. um Abfragezeichenfolgenparameter zu entfernen).

import urllib.parse

urls = [
    'http://www.test.com/TEST1',
    'http://www.test.com/page/TEST2',
    'http://www.test.com/page/page/12345',
    'http://www.test.com/page/page/12345?abc=123'
]

for i in urls:
    url_parts = urllib.parse.urlparse(i)
    path_parts = url_parts[2].rpartition('/')
    print('URL: {}\nreturns: {}\n'.format(i, path_parts[2]))

Ausgabe:

URL: http://www.test.com/TEST1
returns: TEST1

URL: http://www.test.com/page/TEST2
returns: TEST2

URL: http://www.test.com/page/page/12345
returns: 12345

URL: http://www.test.com/page/page/12345?abc=123
returns: 12345

5
os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
>>> folderD

Dies funktioniert auch:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
Alex Glukhovtsev



0

partitionund rpartitionsind auch praktisch für solche Dinge:

url.rpartition('/')[2]

0

Teilen Sie die URL und platzieren Sie das letzte Element url.split('/').pop()


-1
url ='http://www.test.com/page/TEST2'.split('/')[4]
print url

Ausgabe : TEST2.


2
Sie sollten wirklich -1als Index übergeben, sonst funktioniert dies nur bei Zeichenfolgen mit genau so vielen/
Chris_Rands
Durch die Nutzung unserer Website bestätigen Sie, dass Sie unsere Cookie-Richtlinie und Datenschutzrichtlinie gelesen und verstanden haben.
Licensed under cc by-sa 3.0 with attribution required.