यदि मैं करता हूँ
url = "http://example.com?p=" + urllib.quote(query)
- यह (OAuth सामान्यीकरण को तोड़ता है)
/को एनकोड नहीं करता है%2F - यह यूनिकोड को संभालता नहीं है (यह एक अपवाद फेंकता है)
क्या एक बेहतर पुस्तकालय है?
यदि मैं करता हूँ
url = "http://example.com?p=" + urllib.quote(query)
/को एनकोड नहीं करता है%2Fक्या एक बेहतर पुस्तकालय है?
जवाबों:
से डॉक्स :
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।
reserved = ";" | "/" | "?" | ":" | "@" | "&" | "=" | "+" | "$" | ","जो आरक्षित है जो urllib.quote के साथ काम कर रहा है।
urllib.quoteurlib.parse.quoteपायथन 3 के बाद से चले गए ।
urllib.parse.quote डॉक्स
पायथन 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/'
quoteएक वैश्विक के रूप में अस्पष्ट है। यह urlencode की तरह कुछ का उपयोग करने के लिए अच्छा हो सकता है from urllib.parse import quote as urlencode:।
urlencodeसे urllib.parseही एक फ़ंक्शन नाम है जो कुछ पूरी तरह से अलग करता है, इसलिए आप अपने कोड के भविष्य के पाठकों को भ्रमित करने वाले किसी अन्य नाम या जोखिम को लेने से बेहतर होंगे।
मेरा जवाब पाओलो के जवाब के समान है।
मुझे लगता है कि मॉड्यूल requestsबहुत बेहतर है। यह पर आधारित है urllib3। आप यह कोशिश कर सकते हैं:
>>> from requests.utils import quote
>>> quote('/test')
'/test'
>>> quote('/test', safe='')
'%2Ftest'
requests.utils.quoteurllib.quoteअजगर 2 के लिए और urllib.parse.quoteअजगर 3 के लिए एक पतली संगतता रैपर है
यदि आप 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)
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