Comment tout récupérer après le dernier slash dans une URL?

110

Comment puis-je extraire ce qui suit la dernière barre oblique dans une URL en Python? Par exemple, ces URL doivent renvoyer les éléments suivants:

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

J'ai essayé urlparse, mais cela me donne le nom de fichier du chemin complet, tel que page/page/12345.

mélanger
la source
1
Si l'URL peut contenir des chaînes de requêtes comme ...?foo=baret que vous ne le souhaitez pas; Je suggérerais de l'utiliser urlparseen combinaison avec la suggestion de naeg basename.
plundra

Réponses:

243

Vous n'avez pas besoin de choses sophistiquées, regardez simplement les méthodes de chaîne dans la bibliothèque standard et vous pouvez facilement diviser votre URL entre la partie 'filename' et le reste:

url.rsplit('/', 1)

Ainsi, vous pouvez obtenir la pièce qui vous intéresse simplement avec:

url.rsplit('/', 1)[-1]
Luke404
la source
10
url.rsplit('/', 1)renvoie une liste et url.rsplit('/', 1)[-1]correspond au bit après la dernière barre oblique.
Hugo
5
Une autre façon de faire serait: url.rsplit ('/', 1) .pop ()
Alex Fortin
AVERTISSEMENT: cette astuce de base rompt complètement sur les URL telles que http://www.example.com/foo/?entry=the/bar#another/bar. Mais une analyse de base comme rsplitc'est acceptable si vous êtes absolument certain qu'il n'y aura jamais de barres obliques dans vos paramètres de requête ou de fragment. Cependant, je frémis en pensant au nombre de bases de code contenant réellement ce rsplitcode et son bogue associé avec la gestion des requêtes. Les gens qui veulent une SÉCURITÉ ET UNE FIABILITÉ ABSOLUES devraient plutôt utiliser urllib.parse()! Vous pouvez ensuite utiliser la pathvaleur qu'elle renvoie et diviser CELA pour vous assurer que vous avez divisé UNIQUEMENT le chemin.
Mitch McMabers
CODE: Un exemple de la façon de mettre en œuvre la meilleure méthode: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1]) Résultat:foo.htm
Mitch McMabers
70

Encore une (idio (ma) tic) façon:

URL.split("/")[-1]
Kimvais
la source
Oui, c'est plus simple que d'utiliser rsplit.
Jan Kyu Peblik
14

rsplit devrait être à la hauteur de la tâche:

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

Vous pouvez faire comme ceci:

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

Où tail sera le nom de votre fichier.

Neowinston
la source
6

urlparse peut être utilisé si vous le souhaitez (par exemple, pour vous débarrasser de tout paramètre de chaîne de requête).

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

Production:

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

Voici une façon plus générale de procéder par regex:

    re.sub(r'^.+/([^/]+)$', r'\1', url)
sandoronodi
la source
pouvez-vous l'expliquer un peu?
Revolucion pour Monica le
2
extracted_url = url[url.rfind("/")+1:];
Fardjad
la source
j'ai oublié le from string import rfindde votre réponse
Kimvais
0

partitionet rpartitionsont également utiles pour de telles choses:

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

Divisez l'url et affichez le dernier élément url.split('/').pop()

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

Sortie: TEST2.

live_alone
la source
2
Vous devriez vraiment passer -1pour l'index, sinon cela ne fonctionne que sur des chaînes avec exactement ce nombre/
Chris_Rands