URL में अंतिम स्लैश के बाद सब कुछ कैसे प्राप्त करें?


110

पायथन में एक URL में अंतिम स्लैश के बाद मैं कैसे निकाल सकता हूं? उदाहरण के लिए, इन URL को निम्नलिखित वापस करना चाहिए:

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

मैंने उकसाने की कोशिश की है, लेकिन यह मुझे पूर्ण पथ का नाम देता है, जैसे कि page/page/12345


1
यदि URL में querystrings हो सकता है जैसे ...?foo=barऔर आप यह नहीं चाहते हैं; मेरा सुझाव है कि urlparsenaeg -suggestion के साथ संयोजन में उपयोग करें basename
plundra

जवाबों:


243

आपको फैंसी चीजों की आवश्यकता नहीं है, बस मानक पुस्तकालय में स्ट्रिंग विधियों को देखें और आप आसानी से 'फ़ाइल नाम' भाग और बाकी के बीच अपने यूआरएल को विभाजित कर सकते हैं:

url.rsplit('/', 1)

तो आप उस हिस्से को प्राप्त कर सकते हैं, जिसमें आप रुचि रखते हैं:

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

10
url.rsplit('/', 1)एक सूची देता है, और url.rsplit('/', 1)[-1]अंतिम स्लैश के बाद थोड़ा होता है।
ह्यूगो

5
ऐसा करने का एक और तरीका होगा: url.rsplit ('/', 1) .pop ()
एलेक्स फोर्टिन

चेतावनी: यह बुनियादी ट्रिक जैसे URL पर पूरी तरह से टूट जाती है http://www.example.com/foo/?entry=the/bar#another/bar। लेकिन rsplitअगर आप पूरी तरह से निश्चित हैं कि बुनियादी पार्सिंग ठीक है तो आपके प्रश्न या टुकड़े के मापदंडों में कोई भी कमी नहीं होगी। हालाँकि, मैं यह सोचने में कतराता हूँ कि वास्तव में इस rsplitकोड और इसके जुड़े बग में क्वेरी हैंडलिंग के साथ कितने कोडबेस हैं । जो लोग ABSOLUTE SECURITY और RELIABILITY चाहते हैं, उन्हें urllib.parse()इसके बजाय उपयोग करना चाहिए ! फिर आप उस pathमान का उपयोग कर सकते हैं जो यह लौटाता है और यह सुनिश्चित करने के लिए विभाजित करता है कि आपने केवल पथ विभाजित किया है।
मिच मैकमाबर्स

कोड: बेहतर विधि को लागू करने का एक उदाहरण: from urllib.parse import urlparse; p = urlparse("http://www.example.com/foo.htm?entry=the/bar#another/bar"); print(p.path.rsplit("/", 1)[-1]) परिणाम:foo.htm
मिच मैकमाबर्स

70

एक और (idio (मा) टिक) तरीका:

URL.split("/")[-1]

हाँ यह उपयोग करने से अधिक सीधा है rsplit
Jan Kyu Peblik


10

आप इस तरह कर सकते हैं:

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

जहां पूंछ आपके फ़ाइल का नाम होगा।


6

यदि आप (किसी भी क्वेरी स्ट्रिंग पैरामीटर से छुटकारा पाने के लिए) कहना चाहते हैं, तो urlparse का उपयोग करना ठीक है।

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

आउटपुट:

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

यह भी काम करता है:from pathlib import Path print(f"Path(redirected_response.url).stem: {Path(redirected_response.url).stem!r}")
एलेक्स Glukhovtsev

3

यह करने का एक और अधिक सामान्य, रेगेक्स तरीका है:

    re.sub(r'^.+/([^/]+)$', r'\1', url)

क्या आप इसे थोड़ा समझा सकते हैं?
मोनिका


0

partitionऔर rpartitionइस तरह की चीजों के लिए भी उपयोगी हैं:

url.rpartition('/')[2]


हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.