2011-10-18 8 views
67

cgi.parse_qs() का उपयोग करने के बाद, परिणाम (शब्दकोश) को वापस क्वेरी स्ट्रिंग में कैसे परिवर्तित करें? urllib.urlencode() के समान कुछ ढूंढ रहे हैं।पायथन में क्वेरी स्ट्रिंग के लिए शब्दकोश को कैसे परिवर्तित करें?

+5

एनबी: ['cgi.parse_qs()' बहिष्कृत है। इसके बजाय urlparse.parse_qs() का उपयोग करें।] (Http://docs.python.org/library/cgi.html#cgi.parse_qs) – Johnsyweb

+0

** यह भी देखें: ** https://stackoverflow.com/questions/5607551/ how-to-urlencode-a-querystring-in-python – dreftymac

उत्तर

113

the docs से:

urllib.urlencode (query [, doseq])
कन्वर्ट एक मानचित्रण वस्तु या एक "प्रतिशत-एन्कोड" स्ट्रिंग के लिए दो तत्व tuples के एक दृश्य ... एक श्रृंखला key=value जोड़े '&' पात्रों द्वारा अलग ... की

एक dict एक मानचित्रण है।

+0

यह सच है, लेकिन 'cgi.parse_qs() 'द्वारा लौटाया गया' dict'' वास्तव में 'सूची' के रूप में 'मूल्य' है। इन सीधे में से गुजरने के परिणामस्वरूप बहुत अजीब दिखने वाले प्रश्न तार होंगे। – Johnsyweb

+5

जैसा कि दस्तावेज़ कहते हैं, वही है जो 'डोसेक' है। –

+0

पर्याप्त सच है। वह मुझे पहली वाक्य से अधिक पढ़ने के लिए सिखाएगा! – Johnsyweb

-1

शायद तुम कुछ इस तरह की तलाश में हैं:

def dictToQuery(d): 
    query = '' 
    for key in d.keys(): 
    query += str(key) + '=' + str(d[key]) + "&" 
    return query 

यह सिर्फ urlencode की तरह एक शब्दकोश लेता है और यह एक क्वेरी स्ट्रिंग के लिए कनवर्ट। यह क्वेरी स्ट्रिंग में अंतिम "&" जोड़ देगा, लेकिन return query[:-1] यह हल करता है कि, यदि यह कोई समस्या है।

+4

क्या आपने अभी तक 'str.join() 'से मुलाकात की है? 'Urllib.quote_plus()' के बारे में कैसे? –

+1

@garbados आपका समाधान सरल मामलों में काम करना चाहिए। हालांकि, 'urlib' में 'urlencode' देखें।पीई' (यह आपके पायथन इंस्टॉलेशन में होना चाहिए) यह देखने के लिए कि एक क्वेरी स्ट्रिंग क्यों बनाना कभी-कभी उतना आसान नहीं होता जितना आपका जवाब इंगित करता है (विशेष रूप से कुछ वर्णों को 'उद्धरण' करने की आवश्यकता जो यूआरएल में मान्य नहीं हैं)। @ इग्नासिओ ने दो कार्यों का भी संदर्भ दिया है जो आपके कार्यान्वयन को साफ करेंगे और इसे सही बना देंगे। –

+0

आह, वास्तव में। क्रुद्ध कार्यान्वयन के लिए खेद है। शो में जाता है मुझे उन प्रश्नों का अधिक सावधान रहना चाहिए जिनसे मैंने कभी सामना नहीं किया है। – garbados

4

आप बिल्कुलurllib.urlencode() जैसे कुछ ढूंढ रहे हैं!

हालांकि, जब तुम parse_qs() (parse_qsl() से अलग) कहते हैं, शब्दकोश कुंजी अनन्य क्वेरी चर नाम हैं और मान प्रत्येक नाम के लिए मान की सूची नहीं है।

इस जानकारी को urllib.urlencode() में पास करने के लिए, आपको इन सूचियों को "फ़्लैट" करना होगा।

query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist] 
urllib.urlencode(query_pairs) 
+11

या आप 'doseq = True' पास कर सकते हैं। –

+5

या मैं प्रलेखन पढ़ सकता हूं और ऐसा कर सकता हूं! हां :-) – Johnsyweb

+0

@downvoter: मैं इस जवाब को कैसे सुधार सकता हूं? मैंने इसे लिखने के छह साल बाद किया है! – Johnsyweb

27

python3 में, थोड़ा अलग:

from urllib.parse import urlencode 
urlencode({'pram1': 'foo', 'param2': 'bar'}) 

उत्पादन: 'pram1=foo&param2=bar'

को Python2 और python3 संगतता के लिए

, इस कोशिश का तरीका यहां बताया tuples की एक सूची comprehenshion के साथ क्या कर सकते हैं:

try: 
    #python2 
    from urllib import urlencode 
except ImportError: 
    #python3 
    from urllib.parse import urlencode 
संबंधित मुद्दे