Solving problem is about exposing yourself to as many situations as possible like How to urlencode a querystring in Python? and practice these strategies over and over. With time, it becomes second nature and a natural way you approach any problems in general. Big or small, always start with a plan, use other strategies mentioned here till you are confident and ready to code the solution.
In this post, my aim is to share an overview the topic about How to urlencode a querystring in Python?, which can be followed any time. Take easy to follow this discuss.
I am trying to urlencode this string before I submit.
queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"];
Answer #1:
You need to pass your parameters into urlencode()
as either a mapping (dict), or a sequence of 2-tuples, like:
>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'
Python 3 or above
Use:
>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event
Note that this does not do url encoding in the commonly used sense (look at the output). For that use urllib.parse.quote_plus
.
Answer #2:
Python 2
What you’re looking for is 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'
Python 3
In Python 3, the urllib
package has been broken into smaller components. You’ll use urllib.parse.quote_plus
(note the parse
child module)
import urllib.parse
urllib.parse.quote_plus(...)
Answer #3:
Try requests instead of urllib and you don’t need to bother with urlencode!
import requests
requests.get('http://youraddress.com', params=evt.fields)
EDIT:
If you need ordered name-value pairs or multiple values for a name then set params like so:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
instead of using a dictionary.
Answer #4:
Context
- Python (version 2.7.2 )
Problem
- You want to generate a urlencoded query string.
- You have a dictionary or object containing the name-value pairs.
- You want to be able to control the output ordering of the name-value pairs.
Solution
- urllib.urlencode
- urllib.quote_plus
Pitfalls
- dictionary output arbitrary ordering of name-value pairs
- (see also: Why is python ordering my dictionary like so?)
- (see also: Why is the order in dictionaries and sets arbitrary?)
- handling cases when you DO NOT care about the ordering of the name-value pairs
- handling cases when you DO care about the ordering of the name-value pairs
- handling cases where a single name needs to appear more than once in the set of all name-value pairs
Example
The following is a complete solution, including how to deal with some pitfalls.
### ********************
## 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
"""
Answer #6:
Try this:
urllib.pathname2url(stringToURLEncode)
urlencode
won’t work because it only works on dictionaries. quote_plus
didn’t produce the correct output.
Answer #7:
Note that the urllib.urlencode does not always do the trick. The problem is that some services care about the order of arguments, which gets lost when you create the dictionary. For such cases, urllib.quote_plus is better, as Ricky suggested.
Answer #8:
In Python 3, this worked with me
import urllib
urllib.parse.quote(query)