कैसे निरपेक्ष और रिश्तेदार urls में शामिल होने के लिए?


102

मेरे पास दो यूआरएल हैं:

url1 = "http://127.0.0.1/test1/test2/test3/test5.xml"
url2 = "../../test4/test6.xml"

मैं url2 के लिए एक पूर्ण url कैसे प्राप्त कर सकता हूं?



जवाबों:


213

आपको urlparse.urljoin का उपयोग करना चाहिए :

>>> import urlparse
>>> urlparse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'

पायथन 3 के साथ (जहाँ urlparse का नाम बदलकर urllib.parse रखा गया है ) आप इसे निम्नानुसार उपयोग कर सकते हैं :

>>> import urllib.parse
>>> urllib.parse.urljoin(url1, url2)
'http://127.0.0.1/test1/test4/test6.xml'

5
हम urljoin3 या मोड मापदंडों के साथ कैसे उपयोग करते हैं या आप इसके लिए कौन सी लाइब्रेरी की सलाह देते हैं?
मेसुत तस्की

@म्सुअट एक लूप बनाने की कोशिश करते हैं और पहले से जुड़े हुए URL के साथ प्रत्येक भाग को जोड़ते हैं।
सेड्रिक जूलियन

2
@ CédricJulien: एक सरल लूप काम नहीं करेगा, क्योंकि एक अग्रणी /"रीसेट" और वापसी योजना + netloc + lasturl के साथ किसी भी पथ के रूप में :urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
MestreLion

यदि urljoin का उपयोग कर रहे हैं, तो एक समस्या है। उदाहरण के लिए, urljoin('http://www.a.com/', '../../b/c.png')परिणाम है 'http://www.a.com/../../b/c.png', लेकिन नहीं http://www.a.com/b/c.png। तो, क्या कोई विधि है http://www.a.com/b/c.png?
नवंबर को दोपहर

1
पायथन 3 प्रलेखन बिंदुओं को पायथन 2 प्रलेखन से लिंक करें, इसे उत्तर में अपडेट करने की आवश्यकता है, यह docs.python.org/3.6/library/…
हर्ष

8

यदि आपके रिश्तेदार पथ में कई भाग होते हैं, तो आपको उन्हें अलग से जोड़ना urljoinहोगा , क्योंकि यह सापेक्ष पथ को बदल देगा, इसमें शामिल नहीं होगा। इसका उपयोग करने का सबसे आसान तरीका है posixpath

>>> import urllib.parse
>>> import posixpath
>>> url1 = "http://127.0.0.1"
>>> url2 = "test1"
>>> url3 = "test2"
>>> url4 = "test3"
>>> url5 = "test5.xml"
>>> url_path = posixpath.join(url2, url3, url4, url5)
>>> urllib.parse.urljoin(url1, url_path)
'http://127.0.0.1/test1/test2/test3/test5.xml'

यह भी देखें: जब आप पायथन में एक यूआरएल का निर्माण कर रहे हैं, तो एक पथ के घटकों को कैसे शामिल किया जाए


7
es = ['http://127.0.0.1', 'test1', 'test4', 'test6.xml']
base = ''
map(lambda e: urlparse.urljoin(base, e), es)

3
मूल्यों की सूची का समर्थन करने का अच्छा तरीका है। आप अपने साइड इफेक्ट (अपने "बेस" वैरिएबल) को भले ही कम करके इस्तेमाल कर सकते हैं। reduce(lambda a, b: urlparse.urljoin(a, b), es) एक नक्शा list[n] - to -> list[n]ए कम हैlist[n] - to -> a calculated value
पीटर पेरोन

4
>>> from urlparse import urljoin
>>> url1 = "http://www.youtube.com/user/khanacademy"
>>> url2 = "/user/khanacademy"
>>> urljoin(url1, url2)
'http://www.youtube.com/user/khanacademy'

सरल।


3

अजगर 3.0+ के लिए यूआरएल में शामिल होने का सही तरीका है:

from urllib.parse import urljoin
urljoin('https://10.66.0.200/', '/api/org')
# output : 'https://10.66.0.200/api/org'

1

आप reduceक्लीनर फैशन में शिखर की विधि को प्राप्त करने के लिए उपयोग कर सकते हैं ।

>>> import urllib.parse
>>> from functools import reduce
>>> reduce(urllib.parse.urljoin, ["http://moc.com/", "path1/", "path2/", "path3/"])
'http://moc.com/path1/path2/path3/'

ध्यान दें कि इस विधि के साथ, प्रत्येक टुकड़े में आगे-स्लेश का अनुगमन होना चाहिए, जिसमें कोई अग्रणी फ़ॉरवर्ड-स्लैश नहीं होना चाहिए (यह इंगित करने के लिए कि इसमें शामिल होने वाला पथ टुकड़ा है)। यह अधिक सही / सूचनात्मक है, आपको बता रहा है कि path1/एक यूआरआई पथ टुकड़ा है, और पूर्ण पथ /path1/या अज्ञात नहीं है path1, जो या तो हो सकता है (और पूर्ण पथ के रूप में माना जाता है)।

यदि आपको इसकी /कमी के लिए एक खंड में जोड़ना है, तो आप कर सकते हैं:

uri = uri if uri.endswith("/") else f"{uri}/"

URI संकल्प के बारे में अधिक जानने के लिए, विकिपीडिया के कुछ अच्छे उदाहरण हैं।

अपडेट करें

सिर्फ नोटिस पीटर पेरॉन ने शिखर के जवाब को कम करने के बारे में टिप्पणी की, लेकिन मैं इसे फिर से यहां दिखाता हूं कि यह कैसे किया जाता है।

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