¿Cómo obtener todo después de la última barra en una URL?

110

¿Cómo puedo extraer lo que sigue a la última barra en una URL en Python? Por ejemplo, estas URL deben devolver lo siguiente:

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

Probé urlparse, pero eso me da el nombre de archivo de ruta completo, como page/page/12345.

mezcla
fuente
1
Si la URL puede contener cadenas de consulta como ...?foo=bary no desea esto; Sugeriría usarlo urlparseen combinación con la sugerencia de basenamenaeg.
plundra

Respuestas:

243

No necesita cosas sofisticadas, solo vea los métodos de cadena en la biblioteca estándar y puede dividir fácilmente su URL entre la parte 'nombre de archivo' y el resto:

url.rsplit('/', 1)

Para que pueda obtener la pieza que le interesa simplemente con:

url.rsplit('/', 1)[-1]
Luke404
fuente
10
url.rsplit('/', 1)devuelve una lista y url.rsplit('/', 1)[-1]es el bit después de la última barra.
Hugo
5
Otra forma de hacerlo sería: url.rsplit ('/', 1) .pop ()
Alex Fortin
ADVERTENCIA: Este truco básico rompe completamente en URL como http://www.example.com/foo/?entry=the/bar#another/bar. Pero el análisis básico como rsplitestá bien si está absolutamente seguro de que nunca habrá barras inclinadas en su consulta o parámetros de fragmentos. Sin embargo, me estremezco al pensar en cuántas bases de código contienen realmente este rsplitcódigo y su error asociado con el manejo de consultas. ¡Las personas que quieren SEGURIDAD Y FIABILIDAD ABSOLUTAS deberían usar en su urllib.parse()lugar! Luego puede usar el pathvalor que devuelve y dividir ESO para asegurarse de haber dividido SOLO la ruta.
Mitch McMabers
CÓDIGO: Un ejemplo de cómo implementar el mejor método: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1]) Resultado:foo.htm
Mitch McMabers
70

Una forma más (idio (ma) tic):

URL.split("/")[-1]
Kimvais
fuente
Sí, esto es más sencillo que usarlo rsplit.
Jan Kyu Peblik
14

rsplit debe estar a la altura de la tarea:

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

Puedes hacer así:

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

Donde cola será su nombre de archivo.

Neowinston
fuente
6

urlparse está bien para usar si lo desea (por ejemplo, para deshacerse de cualquier parámetro de cadena de consulta).

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

Salida:

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
fuente
5
os.path.basename(os.path.normpath('/folderA/folderB/folderC/folderD/'))
>>> folderD
Rochan
fuente
esto también funciona:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
Alex Glukhovtsev
3

Aquí hay una forma de expresión regular más general de hacer esto:

    re.sub(r'^.+/([^/]+)$', r'\1', url)
Sandoronodi
fuente
¿puedes explicarlo un poco?
Revolución para Monica
2
extracted_url = url[url.rfind("/")+1:];
Fardjad
fuente
olvidé el from string import rfindde su respuesta
Kimvais
0

partitiony rpartitiontambién son útiles para tales cosas:

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

Divide la URL y abre el último elemento. url.split('/').pop()

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

Salida: TEST2.

vivir solo
fuente
2
Realmente debería pasar -1como índice, de lo contrario, esto solo funciona en cadenas con exactamente esa cantidad/
Chris_Rands