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.

mischen
quelle
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]
Luke404
quelle
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
70

Noch ein (idio (ma) tic) Weg:

URL.split("/")[-1]
Kimvais
quelle
Ja, das ist einfacher als die Verwendung rsplit.
Jan Kyu Peblik
14

rsplit sollte der Aufgabe gewachsen sein:

In [1]: 'http://www.test.com/page/TEST2'.rsplit('/', 1)[1]
Out[1]: 'TEST2'
Benjamin Wohlwend
quelle
10

Sie können dies tun:

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

Wo Schwanz wird Ihr Dateiname sein.

Neowinston
quelle
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
Jacob Wan
quelle
5
os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
>>> folderD
Rochan
quelle
Dies funktioniert auch:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
Alex Glukhovtsev
3

Hier ist eine allgemeinere Regex-Methode:

    re.sub(r'^.+/([^/]+)$', r'\1', url)
Sandoronodi
quelle
Kannst du es ein bisschen erklären?
Revolucion für Monica
2
extracted_url = url[url.rfind("/")+1:];
Fardjad
quelle
from string import rfind
Ich
0

partitionund rpartitionsind auch praktisch für solche Dinge:

url.rpartition('/')[2]
tzot
quelle
0

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

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

Ausgabe : TEST2.

alleine leben
quelle
2
Sie sollten wirklich -1als Index übergeben, sonst funktioniert dies nur bei Zeichenfolgen mit genau so vielen/
Chris_Rands