2010-04-03 23 views
30

मैं urllib.urlencode के साथ पायथन में एक शब्दकोश urlencode करने की कोशिश कर रहा हूँ। समस्या यह है कि, मुझे एक सरणी एन्कोड करना है।urlencode मानों की एक सरणी

परिणाम होने की जरूरत है:

criterias%5B%5D=member&criterias%5B%5D=issue 
#unquoted: criterias[]=member&criterias[]=issue 

लेकिन परिणाम मैं मिलता है:

criterias=%5B%27member%27%2C+%27issue%27%5D 
#unquoted: criterias=['member',+'issue'] 

मैं कई बातें की कोशिश की है, लेकिन मैं सही परिणाम प्राप्त नहीं कर पा रहे।

import urllib 
criterias = ['member', 'issue'] 
params = { 
    'criterias[]': criterias, 
} 
print urllib.urlencode(params) 

अगर मैं cgi.parse_qs का प्रयोग कर एक सही क्वेरी स्ट्रिंग डिकोड करने के लिए, मैं परिणाम के रूप में इस मिल:

{'criterias[]': ['member', 'issue']} 

लेकिन अगर मुझे लगता है कि परिणाम सांकेतिक शब्दों में बदलना, मैं एक गलत परिणाम वापस मिलता है। क्या अपेक्षित परिणाम उत्पन्न करने का कोई तरीका है?

+0

'cig.parse_qs' को बहिष्कृत किया गया है (केवल पिछड़ा संगतता के लिए बनाए रखा गया है), इसलिए टिप के लिए धन्यवाद 'urlparse.parse_qs' – ChristopheD

+0

का उपयोग करना बेहतर हो सकता है। मैंने केवल तुलना के लिए इसका इस्तेमाल किया, इसलिए इसका वास्तव में उपयोग नहीं किया जाता है। – Ikke

उत्तर

53

समाधान ऊपर सूचीबद्ध लोगों की तुलना में कहीं अधिक सरल है।

>>> import urllib 
>>> params = {'criterias[]': ['member', 'issue']} 
>>> 
>>> print urllib.urlencode(params, True) 
criterias%5B%5D=member&criterias%5B%5D=issue 

सत्य नोट करें। http://docs.python.org/library/urllib.html#urllib.urlencode doseq चर देखें।

एक साइड नोट के रूप में, आपको इसके लिए [] के लिए एक सरणी के रूप में काम करने की आवश्यकता नहीं है (यही कारण है कि urllib इसमें शामिल नहीं है)। इसका मतलब है कि आपको [] को अपनी सभी सरणी कुंजियों में जोड़ने की आवश्यकता नहीं है।

+0

यदि आप [] नहीं जोड़ते हैं, तो PHP केवल मानदंड = समस्या का उपयोग करेगा, और "सदस्य" –

+0

को अनदेखा कर देगा इस प्रश्न का उत्तर भी देखें: http://stackoverflow.com/questions/6243051/how-to -पास-ए-एरे-इन-ए-क्वेरी-स्ट्रिंग –

+1

स्पष्टीकरण के लिए, पाइथन परवाह नहीं है अगर '[]' 'हैं, तो यह इसे सही ढंग से परिवर्तित करेगा। लेकिन हां, PHP (और शायद अन्य भाषाएं) देखभाल करते हैं, इसलिए यदि आपके पास ऐसी प्रणालियों पर बाहरी निर्भरता है, तो '[] '' को छोड़ना सबसे अच्छा है ... यह सिर्फ पायथन में अजीब दिखता है। – CSTobey

10

आप एक कुंजी-मान जोड़ों के (tuples) सूची का उपयोग कर सकते हैं: किसी भी पैरामीटर शब्दकोश के लिए काम करते हैं और यह में परिवर्तित करने के लिए इस बाहर सार करने के लिए

>>> criterias = ['member', 'issue'] 
>>> urllib.urlencode([('criterias[]', i) for i in criterias]) 
'criterias%5B%5D=member&criterias%5B%5D=issue' 
>>> 
+0

बहुत बुरा यह एकमात्र तरीका है। लेकिन यह समस्या हल हो गई। – Ikke

+0

ठीक है, यह एक ऐसा फ़ंक्शन लिखना बहुत आसान है जो सूचियों के साथ tuples की सूची में बदल देता है। –

+0

दूसरों के लिए सिर्फ एक नोट, नियमित रूप से नियमित रूप से urlencoded स्ट्रिंग उत्पन्न करने के लिए, आपको केवल urlib.urlencode (d.items()) ' – dlrust

2

Listcomp tuples की एक सूची:

import urllib 

def url_encode_params(params={}): 
    if not isinstance(params, dict): 
     raise Exception("You must pass in a dictionary!") 
    params_list = [] 
    for k,v in params.items(): 
     if isinstance(v, list): params_list.extend([(k, x) for x in v]) 
     else: params_list.append((k, v)) 
    return urllib.urlencode(params_list) 

कौन सा अब कुछ तार के साथ एक शब्दकोश है और साथ ही दोनों ऊपर के उदाहरण के लिए काम करना चाहिए एक nd कुछ सरणी मान के रूप में:

criterias = ['member', 'issue'] 
params = { 
    'criterias[]': criterias, 
} 
url_encode_params(params) 
>>'criterias%5B%5D=member&criterias%5B%5D=issue' 
2

:

मूल्यों की
>>> urllib.urlencode([('criterias[]', 'member'), ('criterias[]', 'issue')]) 
'criterias%5B%5D=member&criterias%5B%5D=issue' 
संबंधित मुद्दे