我尝试在提交之前对该字符串进行urlencode。
queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"];
#1楼
请注意,urllib.urlencode并不总是有效。 问题在于某些服务关心参数的顺序,当您创建字典时,这些顺序会丢失。 对于这种情况,如Ricky所建议的那样,urllib.quote_plus更好。
#2楼
供将来参考(例如:适用于python3)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
#3楼
尝试使用请求而不是urllib,您无需费心urlencode!
import requests
requests.get('http://youraddress.com', params=evt.fields)
编辑:
如果您需要有序的名称/值对或一个名称的多个值,请按如下所示设置参数:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
而不是使用字典。
#4楼
语境
- Python(版本2.7.2)
问题
- 您要生成一个urlencoded查询字符串。
- 您有一个包含名称-值对的字典或对象。
- 您希望能够控制名称-值对的输出顺序。
解
- urllib.urlencode
- urllib.quote_plus
陷阱
- 字典输出名称-值对的任意顺序
- (另请参阅: python为什么要像这样对字典进行排序? )
- (另请参见: 为什么字典和集合中的顺序是任意的? )
- 当您不关心名称-值对的排序时,处理案例
- 当您确实关心名称-值对的排序时的处理案例
- 处理单个名称需要在所有名称/值对集中出现多次的情况
例
以下是一个完整的解决方案,包括如何处理一些陷阱。
### ********************
## 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
"""
#5楼
尝试这个:
urllib.pathname2url(stringToURLEncode)
urlencode
将不起作用,因为它仅适用于词典。 quote_plus
没有产生正确的输出。
来源:oschina
链接:https://my.oschina.net/stackoom/blog/3157842