जवाबों:
आपको अपने मापदंडों urlencode()
को या तो एक मैपिंग (तानाशाही), या 2-ट्यूपल्स के अनुक्रम के रूप में पास करना होगा , जैसे:
>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'
अजगर 3 या उससे ऊपर
उपयोग:
>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event
ध्यान दें कि यह आमतौर पर उपयोग किए जाने वाले अर्थ (आउटपुट को देखें) में url एन्कोडिंग नहीं करता है । उस उपयोग के लिए urllib.parse.quote_plus
।
आप क्या देख रहे हैं urllib.quote_plus
:
>>> urllib.quote_plus('string_of_characters_like_these:$#@=?%^Q^$')
'string_of_characters_like_these%3A%24%23%40%3D%3F%25%5EQ%5E%24'
पायथन 3 में, urllib
पैकेज को छोटे घटकों में तोड़ दिया गया है। आप उपयोग करेंगे urllib.parse.quote_plus
( parse
बच्चे मॉड्यूल पर ध्यान दें )
import urllib.parse
urllib.parse.quote_plus(...)
import urllib.parse ... urllib.parse.quote_plus(query)
python3 -c "import urllib.parse, sys; print(urllib.parse.quote_plus(sys.argv[1])) "string to encode"
कमांड लाइन पर एक लाइनर के लिए
Urllib के बजाय अनुरोध करने का प्रयास करें और आपको urlencode से परेशान होने की आवश्यकता नहीं है!
import requests
requests.get('http://youraddress.com', params=evt.fields)
संपादित करें:
यदि आपको एक नाम के लिए नाम-मूल्य जोड़े या कई मानों की आवश्यकता है, तो इस तरह के params सेट करें:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
एक शब्दकोश का उपयोग करने के बजाय।
निम्नलिखित एक पूर्ण समाधान है, जिसमें कुछ नुकसानों से निपटने के तरीके शामिल हैं।
### ********************
## init python (version 2.7.2 )
import urllib
### ********************
## first setup a dictionary of name-value pairs
dict_name_value_pairs = {
"bravo" : "True != False",
"alpha" : "http://www.example.com",
"charlie" : "hello world",
"delta" : "1234567 !@#$%^&*",
"echo" : "user@example.com",
}
### ********************
## setup an exact ordering for the name-value pairs
ary_ordered_names = []
ary_ordered_names.append('alpha')
ary_ordered_names.append('bravo')
ary_ordered_names.append('charlie')
ary_ordered_names.append('delta')
ary_ordered_names.append('echo')
### ********************
## show the output results
if('NO we DO NOT care about the ordering of name-value pairs'):
queryString = urllib.urlencode(dict_name_value_pairs)
print queryString
"""
echo=user%40example.com&bravo=True+%21%3D+False&delta=1234567+%21%40%23%24%25%5E%26%2A&charlie=hello+world&alpha=http%3A%2F%2Fwww.example.com
"""
if('YES we DO care about the ordering of name-value pairs'):
queryString = "&".join( [ item+'='+urllib.quote_plus(dict_name_value_pairs[item]) for item in ary_ordered_names ] )
print queryString
"""
alpha=http%3A%2F%2Fwww.example.com&bravo=True+%21%3D+False&charlie=hello+world&delta=1234567+%21%40%23%24%25%5E%26%2A&echo=user%40example.com
"""
urllib.parse.quote()
अपने आप को पसंद करता हूं क्योंकि यह इसके %20
बजाय उपयोग करता है +
।
इसे इस्तेमाल करे:
urllib.pathname2url(stringToURLEncode)
urlencode
काम नहीं करेगा क्योंकि यह केवल शब्दकोशों पर काम करता है। quote_plus
सही उत्पादन नहीं किया।
my string
करने के लिए my%20string
। आपका समाधान उसके लिए एक आकर्षण की तरह काम करता है!
%20
बदले पाने के लिए काम किया +
। धन्यवाद
ध्यान दें कि urllib.urlencode हमेशा चाल नहीं करता है। समस्या यह है कि कुछ सेवाएं तर्कों के क्रम की परवाह करती हैं, जो जब आप शब्दकोश बनाते हैं तो खो जाते हैं। ऐसे मामलों के लिए, urllib.quote_plus बेहतर है, जैसा कि रिकी ने सुझाव दिया था।
>>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
भविष्य के संदर्भों के लिए (उदा: python3 के लिए)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
'c:/2 < 3'
विंडोज के लिए आउटपुट है '///C://2%20%3C%203'
। मैं ऐसा कुछ चाहता हूं जो सिर्फ आउटपुट देगा 'c:/2%20%3C%203'
।
स्क्रिप्ट / कार्यक्रमों में उपयोग के लिए जिसे अजगर 2 और 3 दोनों का समर्थन करने की आवश्यकता है, छह मॉड्यूल उद्धरण और urlencode फ़ंक्शन प्रदान करता है:
>>> from six.moves.urllib.parse import urlencode, quote
>>> data = {'some': 'query', 'for': 'encoding'}
>>> urlencode(data)
'some=query&for=encoding'
>>> url = '/some/url/with spaces and %;!<>&'
>>> quote(url)
'/some/url/with%20spaces%20and%20%25%3B%21%3C%3E%26'
एक और बात जिसका उल्लेख शायद पहले से ही नहीं किया गया है, वह है कि पैरामीटर में अनुपस्थित के रूप urllib.urlencode()
में शब्दकोश में रिक्त मान को स्ट्रिंग के रूप में एन्कोड किया जाएगा None
। मुझे नहीं पता कि यह आमतौर पर वांछित है या नहीं, लेकिन मेरे उपयोग के मामले में फिट नहीं है, इसलिए मुझे उपयोग करना होगा quote_plus
।
अजगर 3 urllib3 के ठीक से काम करने के लिए, आप इसके आधिकारिक डॉक्स के अनुसार अनुसरण कर सकते हैं :
import urllib3
http = urllib3.PoolManager()
response = http.request(
'GET',
'https://api.prylabs.net/eth/v1alpha1/beacon/attestations',
fields={ # here fields are the query params
'epoch': 1234,
'pageSize': pageSize
}
)
response = attestations.data.decode('UTF-8')