পাইথনে ইউআরএল পরামিতিগুলি কীভাবে শতাংশ-এনকোড করবেন?


299

যদি আমি করি

url = "http://example.com?p=" + urllib.quote(query)
  1. এটি সঙ্কেতাক্ষরে লিখা না /করতে %2F(বিরতি OAuth এর নিয়মমাফিককরণ)
  2. এটি ইউনিকোড পরিচালনা করে না (এটি একটি ব্যতিক্রম ছোঁড়ে)

এর চেয়ে ভাল গ্রন্থাগার কি আছে?


1
এগুলি ইউআরএল প্যারামিটার নয়, এফওয়াইআই। আপনার স্পষ্ট করা উচিত।
জেমি মার্শাল

উত্তর:


390

পাইথন 2

দস্তাবেজগুলি থেকে :

urllib.quote(string[, safe])

% Xx এস্কেপ ব্যবহার করে স্ট্রিংয়ে বিশেষ অক্ষরগুলি প্রতিস্থাপন করুন। চিঠি, অঙ্ক এবং অক্ষর '_.-' কখনই উদ্ধৃত হয় না। ডিফল্টরূপে, এই ফাংশন URL.The ঐচ্ছিক নিরাপদ প্যারামিটার নির্দিষ্ট করে অতিরিক্ত অক্ষর পথ অধ্যায় যে উদ্ধৃত করা উচিত নয় উদ্ধৃত জন্য দেয়ার উদ্দেশ্যে করা হয় - তার ডিফল্ট মান '/'

তার অর্থ নিরাপদে '' পাস করা আপনার প্রথম সমস্যার সমাধান করবে:

>>> urllib.quote('/test')
'/test'
>>> urllib.quote('/test', safe='')
'%2Ftest'

দ্বিতীয় সমস্যা সম্পর্কে, সেখানে এটি সম্পর্কে একটি বাগ রিপোর্ট হয় এখানে । স্পষ্টতই এটি অজগর 3 এ স্থির করা হয়েছিল ut আপনি এটির মতো utf8 হিসাবে এনকোড করে এটির কাজটি করতে পারেন:

>>> query = urllib.quote(u"Müller".encode('utf8'))
>>> print urllib.unquote(query).decode('utf8')
Müller

যাইহোক urlencode এ একবার দেখুন

পাইথন ঘ

একই, urllib.quoteসঙ্গে প্রতিস্থাপন ছাড়া urllib.parse.quote


1
আপনাকে ধন্যবাদ, দুজনই দুর্দান্ত কাজ করেছে। ইউরেনকোড কেবল একটি লুপে বহুবার কোটপ্লাসকে কল করে, যা আমার কাজের (ওআউথ) জন্য সঠিক সাধারণীকরণ নয়।
পল টারজান

6
বৈশিষ্টটি: আরএফসি 2396 এগুলি সংরক্ষিত হিসাবে সংজ্ঞায়িত করে reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","যা urllib.quote এর সাথে কাজ করছে।
জেফ শেফিল্ড

63
urllib.quoteurlib.parse.quoteপাইথন 3-এ স্থানান্তরিত হয়েছে ।
Hibou57


এছাড়াও, একটি অনুসন্ধান ক্যোয়ারী এনকোডিং ক্ষেত্রে, আপনি হয়তো ভাল quote_plus ব্যবহার বন্ধ: docs.python.org/3/library/... 1. এটা ডিফল্ট 2. দ্বারা স্ল্যাশ এনকোড এটি স্পেস এনকোড
পাভেল Vergeev

173

পাইথন 3-এ, urllib.quoteসরানো হয়েছে urllib.parse.quoteএবং এটি ইউনিকোডটি ডিফল্টরূপে পরিচালনা করে।

>>> from urllib.parse import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
>>> quote('/El Niño/')
'/El%20Ni%C3%B1o/'

2
নামটি quoteবিশ্বব্যাপী হিসাবে অস্পষ্ট। এটা তোলে urlencode ভালো কিছু ব্যবহার করতে সুন্দর হতে পারে: from urllib.parse import quote as urlencode
লুক

মনে রাখবেন যে এরই urlencodeমধ্যে একটি ফাংশন রয়েছে যা urllib.parseইতিমধ্যে কিছু আলাদাভাবে কাজ করে, তাই আপনি অন্য কোনও নাম বাছাই করা বা আপনার কোডের ভবিষ্যতের পাঠকদেরকে গুরুতরভাবে বিভ্রান্ত করার ঝুঁকি নিয়ে থাকবেন।
জায়েমার - মনিকা

48

আমার উত্তর পাওলো এর উত্তরের অনুরূপ।

আমি মনে করি মডিউলটি requestsআরও ভাল। এটা তোলে উপর ভিত্তি করে এর urllib3। আপনি এটি চেষ্টা করতে পারেন:

>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'

5
requests.utils.quoteপাইথনের লিঙ্ক quoteঅনুরোধ উত্স দেখুন ।
Cjkjvfnby

16
requests.utils.quoteurllib.quoteপাইথন 2 এবং urllib.parse.quoteঅজগর 3
জেফ শেফিল্ড

13

আপনি যদি জাঙ্গো ব্যবহার করছেন তবে আপনি urlquote ব্যবহার করতে পারেন:

>>> from django.utils.http import urlquote
>>> urlquote(u"Müller")
u'M%C3%BCller'

নোট করুন যে এই উত্তরটি প্রকাশিত হওয়ার পরে পাইথনে পরিবর্তনের অর্থ এই যে এখন এটি একটি উত্তরাধিকারী মোড়ক। Django.utils.http এর জন্য জ্যাঙ্গো ২.১ উত্স কোড থেকে:

A legacy compatibility wrapper to Python's urllib.parse.quote() function.
(was used for unicode handling on Python 2)

2

urlencodeএখানে ব্যবহার করা ভাল । একক প্যারামিটারের জন্য খুব বেশি পার্থক্য নেই তবে আইএমএইচও কোডটি আরও পরিষ্কার করে। (কোনও অনুষ্ঠানটি দেখে বিভ্রান্তিকর quote_plusলাগছে! বিশেষত যারা অন্যান্য নিচু থেকে আসে)

In [21]: query='lskdfj/sdfkjdf/ksdfj skfj'

In [22]: val=34

In [23]: from urllib.parse import urlencode

In [24]: encoded = urlencode(dict(p=query,val=val))

In [25]: print(f"http://example.com?{encoded}")
http://example.com?p=lskdfj%2Fsdfkjdf%2Fksdfj+skfj&val=34

ডক্স

urlencode: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.urlencode

উদ্ধৃতি_প্লাস: https://docs.python.org/3/library/urllib.parse.html#urllib.parse.quote_plus

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