¿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.


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]

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



10

Puedes hacer así:

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

Donde cola será su nombre de archivo.


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

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

esto también funciona: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:];

olvidé el from string import rfindde su respuesta
Kimvais

0

partitiony rpartitiontambién son útiles para tales cosas:

url.rpartition('/')[2]


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

Salida: TEST2.


2
Realmente debería pasar -1como índice, de lo contrario, esto solo funciona en cadenas con exactamente esa cantidad/
Chris_Rands
Al usar nuestro sitio, usted reconoce que ha leído y comprende nuestra Política de Cookies y Política de Privacidad.
Licensed under cc by-sa 3.0 with attribution required.