2009-11-08 19 views
207

अगर मैंपायथन में यूआरएल पैरामीटर को प्रतिशत-एन्कोड कैसे करें?

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

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

उत्तर

282
docs से

:

urllib.quote(string[, safe]) 

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

है

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

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

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

वैसे में urlencode

नोट एक नज़र कि urllib.quote python3

में
+0

धन्यवाद आप, दोनों महान काम किया। urlencode बस लूप में कई बार quoteplus कहते हैं, जो मेरे कार्य (oauth) के लिए सही सामान्यीकरण नहीं है। –

+4

spec: [rfc 2396] (https://www.ietf.org/rfc/rfc2396.txt) इन्हें आरक्षित 'आरक्षित = "के रूप में परिभाषित करता है;" | "/" | "?" | ":" | "@" | "और" | "=" | "+" | "$" | "," जो urllib.quote से निपट रहा है। –

+25

'urllib.quote' पाइथन 3 के बाद से' urlib.parse.quote' पर ले जाया गया। – Hibou57

107

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/' 
29

मेरा उत्तर पाओलो के उत्तर के समान है।

मुझे लगता है कि मॉड्यूल requests बहुत बेहतर है। यह urllib3 पर आधारित है। आप इस कोशिश कर सकते हैं:

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

' request.utils.quote' पायथन 'उद्धरण से लिंक है '। [अनुरोध स्रोत] देखें (https: // github।com/kennethreitz/अनुरोध/ब्लॉब/मास्टर/अनुरोध/compat.py # L36)। – Cjkjvfnby

+8

'request.utils.quote' पायथन 3 के लिए' urllib.quote' और पायथन 3 के लिए 'urllib.parse.quote'' के लिए एक पतली संगतता रैपर है –

8

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

>>> from django.utils.http import urlquote 
>>> urlquote(u"Müller") 
u'M%C3%BCller' 
संबंधित मुद्दे