पायथन, विपरीत कार्य urllib.urlencode


88

मैं प्रसंस्करण के बाद डेटा को कैसे परिवर्तित कर सकता हूं urllib.urlencode? urllib.urldecodeअस्तित्व में नहीं है।

जवाबों:


124

कहने के लिए डॉक्स के रूप मेंurlencode ,

Urlparse मॉड्यूल फ़ंक्शन parse_qs () और parse_qsl () प्रदान करता है, जिनका उपयोग पायथन डेटा संरचनाओं में क्वेरी स्ट्रिंग पार्स करने के लिए किया जाता है।

(पुराने पायथन रिलीज में, वे cgiमॉड्यूल में थे )। इसलिए, उदाहरण के लिए:

>>> import urllib
>>> import urlparse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urlparse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}

मूल शब्दकोश dऔर "राउंड-ट्रिप्ड" के बीच स्पष्ट अंतर d1यह है कि बाद वाले के पास (एकल-आइटम, इस मामले में) मूल्यों के रूप में सूचीबद्ध है - ऐसा इसलिए है क्योंकि क्वेरी स्ट्रिंग्स में कोई विशिष्टता गारंटी नहीं है, और यह महत्वपूर्ण हो सकता है आपके एप्लिकेशन को यह जानने के लिए कि प्रत्येक कुंजी के लिए कितने मान दिए गए हैं (यानी, सूची हमेशा एकल-आइटम वाले नहीं होगी; ;-)

विकल्प के रूप में:

>>> sq = urlparse.parse_qsl(s)
>>> sq  
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

आप जोड़े का एक क्रम प्राप्त कर सकते हैं (urlencode इस तरह के एक तर्क को स्वीकार करता है, भी - इस मामले में यह आदेश को संरक्षित करता है, जबकि तानाशाह के मामले में; संरक्षित करने का कोई आदेश नहीं है;;;)। यदि आप जानते हैं कि कोई डुप्लिकेट "कुंजियाँ" नहीं हैं, या अगर वहाँ हैं, तो परवाह न करें, (जैसा कि मैंने दिखाया है) आप dictगैर-सूची मूल्यों के साथ एक शब्दकोश प्राप्त करने के लिए कॉल कर सकते हैं। सामान्य तौर पर, हालांकि, आपको यह विचार करने की आवश्यकता है कि यदि आप डुप्लिकेट मौजूद हैं तो आप क्या करना चाहते हैं (पायथन तय नहीं करता है कि आपकी ओर ;-)


1
बहुत गहन उत्तर। बहुत बढ़िया!
हार्टले ब्रॉडी

1
अजगर 2 के लिए वोट करें, हालांकि urllibमॉड्यूल में पायथन 3 सभी है । @Phobie उत्तर देखें।
ओपनवॉक

19

एलेक्स के समाधान के लिए पायथन 3 कोड :

>>> import urllib.parse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.parse.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urllib.parse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}

वैकल्पिक:

>>> sq = urllib.parse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

parse_qsl प्रतिवर्ती है:

>>> urllib.parse.urlencode(sq)
'a=b&c=d'

16

urllib.unquote_plus()जो तुम चाहते हो। यह उनके एकल-वर्ण समकक्ष द्वारा% xx से बचता है और रिक्त स्थान के साथ साथ प्लस संकेतों को बदलता है।

उदाहरण:

unquote_plus('/%7Ecandidates/?name=john+connolly') 

पैदावार

'/~candidates/?name=john connolly'.

2
उन्होंने कहा, वह एक तानाशाही चाहते थे। तो आपका जवाब गलत है।
बलोर्क

4
हाँ, यह वही है जिसकी मुझे तलाश थी।
जो
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.