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.


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]

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



10

Você pode fazer assim:

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

Onde tail será o nome do arquivo.


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

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

isso também 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:];

esqueci o from string import rfindda sua resposta
Kimvais

0

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

url.rpartition('/')[2]

0

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


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

Saída: TEST2.


2
Você realmente deve passar -1como o índice, caso contrário, isso só funciona em strings com exatamente essa quantidade/
Chris_Rands
Ao utilizar nosso site, você reconhece que leu e compreendeu nossa Política de Cookies e nossa Política de Privacidade.
Licensed under cc by-sa 3.0 with attribution required.