पायथन में एक क्वेरिस्ट्रिंग को कैसे उतारा जाए?


552

मैं सबमिट करने से पहले इस स्ट्रिंग को urlencode करने का प्रयास कर रहा हूं।

queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"]; 

जवाबों:


561

आपको अपने मापदंडों 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


12
"ध्यान दें कि urllib.urlencode हमेशा चाल नहीं करता है। समस्या यह है कि कुछ सेवाएं तर्क के क्रम के बारे में परवाह करती हैं, जो आप शब्दकोश बनाते समय खो जाते हैं। ऐसे मामलों के लिए, urllib.quote_plus बेहतर है, जैसा रिकी ने सुझाव दिया था। "
ब्लेयरग 2323

16
तकनीकी रूप से, यह सेवाओं में एक बग है, है ना?
होल्डनवेब

5
और अगर आप एक पूर्ण क्वेरी तर्क स्ट्रिंग के निर्माण के बिना एक स्ट्रिंग URL को सुरक्षित बनाना चाहते हैं, तो यह कैसे करेगा?
माइक 'पोमैक्स' कामेरमेंस

1
@ माइक'पोमैक्स'कैमरेन्स - उदाहरण के लिए देखें stackoverflow.com/questions/12082314/… या इस सवाल का रिकी जवाब।
bgporter

1
@ bk0 ऐसा लगता है कि आपकी विधि केवल शब्दकोशों के लिए मान्य है, और तार नहीं।
JD Gamboa

1021

अजगर २

आप क्या देख रहे हैं 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(...)

4
धन्यवाद! मेरे मामले में हालांकि मुझे यह import urllib.parse ... urllib.parse.quote_plus(query)
कहना चाहिए

3
बहुत अच्छा है, लेकिन यूनिकोड का उपयोग क्यों नहीं किया जाता है? यदि यूआरएल स्ट्रिंग यूनिकोड है, तो मुझे इसे UTF-8 में सांकेतिक शब्दों में बदलना चाहिए। क्या ऐसा करने का कोई अन्य तरीका है?
कार्ल डोएनिट्ज

7
यह बहुत अच्छा काम करता है, लेकिन मैं कुछ ऑनलाइन सेवाओं (REST) ​​तक पहुंच नहीं सका जब तक कि मैंने इस पैरामीटर को सुरक्षित नहीं जोड़ा = '; /
?:

मैंने कोशिश की कि पायथन 3 में लेकिन सक्षम नहीं था: stackoverflow.com/questions/40557606/…
amphibient

1
python3 -c "import urllib.parse, sys; print(urllib.parse.quote_plus(sys.argv[1])) "string to encode"कमांड लाइन पर एक लाइनर के लिए
अमोस जोशुआ

51

Urllib के बजाय अनुरोध करने का प्रयास करें और आपको urlencode से परेशान होने की आवश्यकता नहीं है!

import requests
requests.get('http://youraddress.com', params=evt.fields)

संपादित करें:

यदि आपको एक नाम के लिए नाम-मूल्य जोड़े या कई मानों की आवश्यकता है, तो इस तरह के params सेट करें:

params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]

एक शब्दकोश का उपयोग करने के बजाय।


5
यह नाम मान जोड़े के आदेश देने के मुद्दे को संबोधित नहीं करता है, इसके लिए बाहरी पुस्तकालयों को स्थापित करने की अनुमति की आवश्यकता होती है जो परियोजना के लिए संभव नहीं है।
dreftymac

मैंने न्यूनतम कोड पोस्ट किया जो ओपी के लिए काम करेगा। ओपी ने आदेशित जोड़े का अनुरोध नहीं किया हालांकि यह भी संभव है, मेरा अपडेट देखें।
बार्नी

@dreftymac: यह एड्रेस ऑर्डरिंग करता है (हालांकि यह सवाल का हिस्सा नहीं था), कृपया मेरे अपडेट किए गए उत्तर को पढ़ें।
बार्नी

36

प्रसंग

  • पायथन (संस्करण २.th.२)

मुसीबत

  • आप एक urlencoded क्वेरी स्ट्रिंग उत्पन्न करना चाहते हैं।
  • आपके पास एक शब्दकोश या वस्तु है, जिसमें नाम-मूल्य जोड़े हैं।
  • आप नाम-मूल्य जोड़े के आउटपुट ऑर्डर को नियंत्रित करने में सक्षम होना चाहते हैं।

समाधान

  • urllib.urlencode
  • urllib.quote_plus

नुकसान

  • नाम-मूल्य जोड़े के शब्दकोश आउटपुट मनमाना आदेश
  • जब आप नाम-मूल्य जोड़े के आदेश के बारे में परवाह नहीं करते हैं तो मामलों को संभालना
  • जब आप नाम-मूल्य जोड़े के आदेश के बारे में परवाह करते हैं तो मामलों को संभालना
  • उन मामलों को संभालना जहां सभी नाम-मूल्य वाले जोड़े के सेट में एक ही नाम को एक से अधिक बार दिखाई देने की आवश्यकता होती है

उदाहरण

निम्नलिखित एक पूर्ण समाधान है, जिसमें कुछ नुकसानों से निपटने के तरीके शामिल हैं।

### ********************
## 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
  """ 


23

इसे इस्तेमाल करे:

urllib.pathname2url(stringToURLEncode)

urlencodeकाम नहीं करेगा क्योंकि यह केवल शब्दकोशों पर काम करता है। quote_plusसही उत्पादन नहीं किया।


यह वास्तव में उपयोगी है! मेरे मामले में, मैं केवल स्ट्रिंग के एक हिस्से यूआरएल एन्कोड करने के लिए है कि मैं करना चाहते हैं, उदाहरण के लिए मैं बदलना चाहते हैं my stringकरने के लिए my%20string। आपका समाधान उसके लिए एक आकर्षण की तरह काम करता है!
TanguyP

मेरे %20बदले पाने के लिए काम किया +। धन्यवाद
Jossef Harush

21

ध्यान दें कि urllib.urlencode हमेशा चाल नहीं करता है। समस्या यह है कि कुछ सेवाएं तर्कों के क्रम की परवाह करती हैं, जो जब आप शब्दकोश बनाते हैं तो खो जाते हैं। ऐसे मामलों के लिए, urllib.quote_plus बेहतर है, जैसा कि रिकी ने सुझाव दिया था।


2
यह ठीक काम करता है और यदि आप ट्यूपल्स की सूची पास करते हैं तो ऑर्डर सुरक्षित रखता है:>>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
ब्रैंडन रोड्स


6

भविष्य के संदर्भों के लिए (उदा: python3 के लिए)

>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'

1
आमतौर पर आप केवल उन मूल्यों को एनकोड करना चाहते हैं, जो आपने यहां किए हैं, एक अमान्य GET क्वेरी
बनाएंगे

'c:/2 < 3'विंडोज के लिए आउटपुट है '///C://2%20%3C%203'। मैं ऐसा कुछ चाहता हूं जो सिर्फ आउटपुट देगा 'c:/2%20%3C%203'
binki

3

स्क्रिप्ट / कार्यक्रमों में उपयोग के लिए जिसे अजगर 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'

2

यदि urllib.parse.urlencode () आपको त्रुटियां दे रहा है, तो urllib3 मॉड्यूल आज़माएं।

वाक्य रचना इस प्रकार है:

import urllib3
urllib3.request.urlencode({"user" : "john" }) 

1

एक और बात जिसका उल्लेख शायद पहले से ही नहीं किया गया है, वह है कि पैरामीटर में अनुपस्थित के रूप urllib.urlencode()में शब्दकोश में रिक्त मान को स्ट्रिंग के रूप में एन्कोड किया जाएगा None। मुझे नहीं पता कि यह आमतौर पर वांछित है या नहीं, लेकिन मेरे उपयोग के मामले में फिट नहीं है, इसलिए मुझे उपयोग करना होगा quote_plus


0

अजगर 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')
हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.