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.


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]

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


14

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

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

10

Vous pouvez faire comme ceci:

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

Où tail sera le nom de votre fichier.


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

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

cela fonctionne également: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:];

j'ai oublié le from string import rfindde votre réponse
Kimvais

0

partitionet rpartitionsont également utiles pour de telles choses:

url.rpartition('/')[2]

0

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


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

Sortie: TEST2.


2
Vous devriez vraiment passer -1pour l'index, sinon cela ne fonctionne que sur des chaînes avec exactement ce nombre/
Chris_Rands
En utilisant notre site, vous reconnaissez avoir lu et compris notre politique liée aux cookies et notre politique de confidentialité.
Licensed under cc by-sa 3.0 with attribution required.