2012-01-18 5 views
20

में यूआरएल एन्कोडिंग क्या urllib या इस कार्य के लिए अन्य लाइब्रेरी में कोई आसान तरीका है? यूआरएल एन्कोडिंग असुरक्षित ASCII वर्णों को "%" के साथ दो हेक्साडेसिमल अंकों के साथ बदल देता है।पाइथन

यहाँ एक इनपुट का एक उदाहरण है और मेरी उम्मीद उत्पादन:

Mozilla/5.0 (Linux; U; Android 4.0; xx-xx; Galaxy Nexus Build/IFL10C) AppleWebKit/534.30 (KHTML, like Gecko) Version/4.0 Mobile Safari/534.30 

Mozilla%2F5.0+%28Linux%3B+U%3B+Android+4.0%3B+xx-xx%3B+Galaxy+Nexus+Build%2FIFL10C%29+AppleWebKit%2F534.30+%28KHTML%2C+like+Gecko%29+Version%2F4.0+Mobile+Safari%2F534.30 

उत्तर

41

पायथन 2.x के लिए, का उपयोग urllib.quote

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

उदाहरण:

In [1]: import urllib 

In [2]: urllib.quote('%') 
Out[2]: '%25' 

संपादित:

आपके मामले में, आदेश धन चिह्नों द्वारा स्पेस के स्थान पर, आप उपयोग कर सकते हैं urllib.quote_plus

उदाहरण:

In [4]: urllib.quote_plus('a b') 
Out[4]: 'a+b' 

अजगर 3.x के लिए, quote

>>> import urllib 
>>> a = "asdas#@das" 
>>> urllib.parse.quote(a) 
'asdas%23%40das' 

और अंतरिक्ष उपयोग 'quote_plus' के साथ स्ट्रिंग के लिए उपयोग

>>> import urllib 
>>> a = "as da& s#@das" 
>>> urllib.parse.quote_plus(a) 
'as+da%26+s%23%40das' 
+0

या [urllib.quote_plus] (http://docs.python.org/library/urllib.html#urllib.quote_plus), चूंकि ओपी '% 20' के बजाय' + 'चाहता है। – Avaris

+2

लेकिन ओपी पूछने के लिए, 'urllib.quote_plus' का उपयोग करें। –

1

इसके अलावा, अगर आप कई मूल्यों की एक dict है, सबसे अच्छा तरीका यह करने के लिए urllib.urlencode होगा।

2

ध्यान रखें कि दोनों urllib.quote और urllib.quote_plus एक त्रुटि फेंक रखें कि यदि एक इनपुट एक यूनिकोड स्ट्रिंग है:

s = u'\u2013' 
urllib.quote(s) 

Traceback (most recent call last): 
    File "<stdin>", line 1, in <module> 
    File "C:\Python27\lib\urllib.py", line 1303, in quote 
    return ''.join(map(quoter, s)) 
KeyError: u'\u2013' 

के रूप में दिए here on SO, एक का उपयोग करना पड़ता है 'UTF-8' स्पष्ट रूप से:

urllib.quote(s.encode('utf-8'))