Python में URL पैरामीटर को प्रतिशत-एन्कोड कैसे करें?


299

यदि मैं करता हूँ

url = "http://example.com?p=" + urllib.quote(query)
  1. यह (OAuth सामान्यीकरण को तोड़ता है) /को एनकोड नहीं करता है%2F
  2. यह यूनिकोड को संभालता नहीं है (यह एक अपवाद फेंकता है)

क्या एक बेहतर पुस्तकालय है?


1
ये URL पैरामीटर नहीं हैं, FYI करें। आपको स्पष्ट करना चाहिए।
जेमी मार्शल

जवाबों:


390

अजगर २

से डॉक्स :

urllib.quote(string[, safe])

% Xx से बचकर स्ट्रिंग में विशेष वर्ण बदलें। अक्षर, अंक, और अक्षर '_-' को कभी उद्धृत नहीं किया जाता है। डिफ़ॉल्ट रूप से, यह फ़ंक्शन URL के पथ अनुभाग को उद्धृत करने के लिए लक्षित है। वैकल्पिक सुरक्षित पैरामीटर अतिरिक्त वर्ण निर्दिष्ट करता है जिन्हें उद्धृत नहीं किया जाना चाहिए - इसका डिफ़ॉल्ट मान '/' है

इसका मतलब है कि सुरक्षित के लिए '' पास करना आपके पहले मुद्दे को हल करेगा:

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

दूसरे मुद्दे के बारे में, यहाँ इसके बारे में एक बग रिपोर्ट है । जाहिरा तौर पर यह अजगर में तय किया गया था 3. आप इसे इस तरह utf8 के रूप में एन्कोडिंग द्वारा इसे हल कर सकते हैं:

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

वैसे urlencode पर एक नज़र है

अजगर ३

एक ही है, की जगह सिवाय urllib.quoteसाथ urllib.parse.quote


1
धन्यवाद, दोनों ने बहुत अच्छा काम किया। urlencode बस एक लूप में कई बार quotplus कहता है, जो मेरे कार्य (oauth) के लिए सही सामान्यीकरण नहीं है।
पॉल टार्जन

6
युक्ति: rfc 2396 इन्हें परिभाषित करता है reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","जो आरक्षित है जो urllib.quote के साथ काम कर रहा है।
जेफ शेफील्ड

63
urllib.quoteurlib.parse.quoteपायथन 3 के बाद से चले गए ।
हिबू ५


इसके अलावा, खोज क्वेरी एन्कोडिंग के मामले में, आप शायद quot_plus का उपयोग करके बेहतर हो सकते हैं: docs.python.org/3/library/… 1. यह डिफ़ॉल्ट रूप से स्लैश को एन्कोड करता है। यह रिक्त स्थान को भी
घेरता है

174

पायथन 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

यदि आप django का उपयोग कर रहे हैं, तो आप urlquote का उपयोग कर सकते हैं:

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

ध्यान दें कि इस उत्तर के प्रकाशित होने के बाद से पाइथन में बदलाव का मतलब है कि यह अब एक विरासत आवरण है। Django 2.1 स्रोत कोड से django.utils.http के लिए:

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

2

urlencodeयहां उपयोग करना बेहतर है। सिंगल पैरामीटर के लिए ज्यादा अंतर नहीं है लेकिन IMHO कोड को स्पष्ट करता है। (यह एक समारोह को देखने के लिए भ्रामक लग रहा है 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

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

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