Como obter tudo após a última barra em um URL?

110

Como posso extrair tudo o que segue a última barra em uma URL em Python? Por exemplo, esses URLs devem retornar o seguinte:

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

Tentei urlparse, mas ele me dá o nome do arquivo do caminho completo, como page/page/12345.

misturar
fonte
1
Se a URL pode conter strings de consulta como ...?foo=bare você não quer isso; Eu sugiro o uso urlparseem combinação com a -sugestão de Naeg basename.
plundra

Respostas:

243

Você não precisa de coisas fantasiosas, apenas veja os métodos de string na biblioteca padrão e você pode facilmente dividir seu url entre a parte 'nome do arquivo' e o resto:

url.rsplit('/', 1)

Assim, você pode obter a parte em que está interessado simplesmente com:

url.rsplit('/', 1)[-1]
Luke404
fonte
10
url.rsplit('/', 1)retorna uma lista e url.rsplit('/', 1)[-1]é o bit após a última barra.
Hugo
5
Outra maneira de fazer seria: url.rsplit ('/', 1) .pop ()
Alex Fortin
AVISO: Este truque básico quebra completamente em URLs como http://www.example.com/foo/?entry=the/bar#another/bar. Mas a análise básica como rsplitestá tudo bem se você tiver certeza absoluta de que nunca haverá barras em seus parâmetros de consulta ou fragmento. No entanto, estremeço ao pensar em quantas bases de código realmente contêm esse rsplitcódigo e seu bug associado ao tratamento de consultas. Pessoas que desejam SEGURANÇA E CONFIABILIDADE ABSOLUTAS deveriam usar urllib.parse()! Você pode então usar o pathvalor que ele retorna e dividir ISSO para garantir que você dividiu SOMENTE o caminho.
Mitch McMabers
CÓDIGO: Um exemplo de como implementar o melhor 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

Mais uma forma (idio (má) tica):

URL.split("/")[-1]
Kimvais
fonte
Sim, isso é mais simples do que usar rsplit.
Jan Kyu Peblik
14

rsplit deve estar à altura da tarefa:

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

Você pode fazer assim:

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

Onde tail será o nome do arquivo.

Neowinston
fonte
6

urlparse pode ser usado se você quiser (digamos, para se livrar de quaisquer parâmetros de string 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]))

Resultado:

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

Esta é uma maneira mais geral de regex de fazer isso:

    re.sub(r'^.+/([^/]+)$', r'\1', url)
Sandoronodi
fonte
você pode explicar um pouco?
Revolucion para Monica
2
extracted_url = url[url.rfind("/")+1:];
Fardjad
fonte
esqueci o from string import rfindda sua resposta
Kimvais
0

partitione rpartitiontambém são úteis para essas coisas:

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

Divida o url e exiba o último elemento url.split('/').pop()

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

Saída: TEST2.

viver sozinho
fonte
2
Você realmente deve passar -1como o índice, caso contrário, isso só funciona em strings com exatamente essa quantidade/
Chris_Rands