কীভাবে পরম এবং আপেক্ষিক url- এ যোগদান করবেন?


109

আমার দুটি ইউআরএল রয়েছে:

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

আমি কীভাবে url2 এর জন্য পরম url পেতে পারি?



উত্তর:


222

আপনার 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 এর সাথে প্রতিটি অংশে যোগদান করুন join
সিড্রিক জুলিয়েন

4
@ সিড্রিক জুলিয়ান: একটি সরল লুপ কাজ করবে না, কারণ শীর্ষস্থানীয় কোনও পথ /"রিসেট" করবে এবং স্কিমটি + নেটলোক + লাস্টারল রিটার্ন করবে:urlparse.urljoin('http://www.a.com/b/c/d', '/e') => 'http://www.a.com/e'
ম্যাস্ট্রেলিয়ন

যদি 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?
বিগউইন্ড

4
পাইথন 3 ডকুমেন্টেশনের লিঙ্কটি পাইথন 2 ডকুমেন্টেশনের দিকে ইঙ্গিত করে, উত্তরে এটি আপডেট হওয়া দরকার, এটি ডকস.পিথন.আর .3.6
হর্ষ

9

যদি আপনার আপেক্ষিক পথে একাধিক অংশ থাকে তবে আপনাকে পৃথকভাবে তাদের সাথে যোগ দিতে 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)

4
মানগুলির একটি তালিকা সমর্থন করার ভাল উপায়। আপনি যদিও একটি হ্রাস ব্যবহার করে আপনার পার্শ্ব প্রতিক্রিয়া (আপনার "বেস" ভেরিয়েবল) মুছে ফেলতে পারেন। reduce(lambda a, b: urlparse.urljoin(a, b), es) একটি মানচিত্র list[n] - to -> list[n]হ্রাস হ'লlist[n] - to -> a calculated value
পিটার পেরোন

5
>>> 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}/"

ইউআরআই রেজোলিউশন সম্পর্কে আরও জানতে, উইকিপিডিয়ায় কিছু দুর্দান্ত উদাহরণ রয়েছে।

হালনাগাদ

শিখরের জবাব হ্রাস করার বিষয়ে কেবল পিটার পেরোন মন্তব্য করেছেন, তবে কীভাবে এটি হয়েছে তা প্রদর্শন করার জন্য আমি এটি এখানে রেখে দেব।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.