Come ottenere tutto dopo l'ultima barra in un URL?


110

Come posso estrarre tutto ciò che segue l'ultima barra in un URL in Python? Ad esempio, questi URL dovrebbero restituire quanto segue:

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

Ho provato urlparse, ma questo mi dà il nome del file del percorso completo, come page/page/12345.


1
Se l'URL potrebbe contenere stringhe di query come ...?foo=bare non lo vuoi; Suggerirei l'uso urlparsein combinazione con il suggerimento di basenameNaeg.
plundra

Risposte:


243

Non hai bisogno di cose fantasiose, guarda e basta i metodi delle stringhe nella libreria standard e puoi facilmente dividere il tuo URL tra la parte 'filename' e il resto:

url.rsplit('/', 1)

Quindi puoi ottenere la parte che ti interessa semplicemente con:

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

10
url.rsplit('/', 1)restituisce un elenco ed url.rsplit('/', 1)[-1]è il bit dopo l'ultima barra.
Hugo

5
Un altro modo per farlo sarebbe: url.rsplit ('/', 1) .pop ()
Alex Fortin

ATTENZIONE: questo trucco di base si interrompe completamente su URL come http://www.example.com/foo/?entry=the/bar#another/bar. Ma l'analisi di base come rsplitva bene se sei assolutamente certo che non ci saranno mai barre nei parametri della query o del frammento. Tuttavia, mi vengono i brividi al pensiero di quante basi di codice contengono effettivamente questo rsplitcodice e il bug associato con la gestione delle query. Le persone che vogliono SICUREZZA E AFFIDABILITÀ ASSOLUTA dovrebbero urllib.parse()invece usare ! È quindi possibile utilizzare il pathvalore restituito e dividerlo per assicurarsi di aver diviso SOLO il percorso.
Mitch McMabers

CODICE: Un esempio di come implementare il metodo migliore: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1]) Risultato:foo.htm
Mitch McMabers,


14

rsplit dovrebbe essere all'altezza del compito:

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

10

Puoi fare così:

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

Dove tail sarà il nome del tuo file.


6

urlparse va bene da usare se lo desideri (ad esempio, per sbarazzarti di qualsiasi parametro della stringa di query).

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]))

Produzione:

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

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


2
extracted_url = url[url.rfind("/")+1:];

from string import rfind
ho

0

partitione rpartitionsono utili anche per queste cose:

url.rpartition('/')[2]

0

Dividi l'URL e fai apparire l'ultimo elemento url.split('/').pop()


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

Uscita: TEST2.


2
Dovresti davvero passare -1come indice, altrimenti funziona solo su stringhe con esattamente così tanti/
Chris_Rands
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.