Bir URL'deki son eğik çizgiden sonra her şey nasıl elde edilir?


110

Python'da bir URL'deki son bölü çizgisini izleyen şeyi nasıl çıkarabilirim? Örneğin, bu URL'ler aşağıdakileri döndürmelidir:

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

Urlparse denedim, ama bu bana tam yol dosya adını veriyor, örneğin page/page/12345.


1
URL gibi sorgu dizeleri içeriyorsa ...?foo=barve bunu istemiyorsanız; urlparseNaeg'in basenameönerisiyle birlikte kullanmanızı öneririm.
plundra

Yanıtlar:


243

Süslü şeylere ihtiyacınız yok, sadece standart kitaplıktaki dize yöntemlerini görün ve url'nizi 'dosya adı' kısmı ile geri kalanı arasında kolayca bölebilirsiniz:

url.rsplit('/', 1)

Böylece ilgilendiğiniz kısmı basitçe şununla elde edebilirsiniz:

url.rsplit('/', 1)[-1]

10
url.rsplit('/', 1)bir liste döndürür url.rsplit('/', 1)[-1]ve son bölü çizgisinden sonraki bittir.
Hugo

5
Yapmanın başka bir yolu da: url.rsplit ('/', 1) .pop ()
Alex Fortin

UYARI: Bu temel numara, gibi URL'lerde tamamen bozulur http://www.example.com/foo/?entry=the/bar#another/bar. Ancak rsplit, sorgu veya parça parametrelerinizde hiçbir zaman eğik çizgi olmayacağından kesinlikle eminseniz, gibi temel ayrıştırma tamamdır. Ancak, kaç tane kod tabanının bu rsplitkodu içerdiğini ve sorgu işlemeyle ilgili hatayı düşünmek beni ürpertiyor . KESİNLİKLE GÜVENLİK VE GÜVENİLİRLİK isteyenler urllib.parse()bunun yerine kullanmalı! Ardından, pathdöndürdüğü değeri kullanabilir ve SADECE yolu böldüğünüzden emin olmak için BUNU bölebilirsiniz.
Mitch McMabers

KOD: Daha iyi yöntemin nasıl uygulanacağına dair bir örnek: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1]) Sonuç:foo.htm
Mitch McMabers



10

Bunu beğenebilirsin:

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

Kuyruk dosya adınız olacak.


6

İsterseniz urlparse'ı kullanabilirsiniz (örneğin, herhangi bir sorgu dizesi parametresinden kurtulmak için).

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

Çıktı:

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

bu da işe from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
yarar


2
extracted_url = url[url.rfind("/")+1:];

from string import rfindcevabını unuttum
Kimvais

0

partitionve rpartitionbu tür şeyler için de kullanışlıdır:

url.rpartition('/')[2]


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

Çıktı: TEST2.


2
-1İndeks olarak gerçekten geçmelisiniz , aksi takdirde bu sadece tam olarak bu kadar çok /
dizgede
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.