如何urlencode在Python查询string?
我正在尝试在提交之前对此string进行urlencode编码。
queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"];
你需要将你的参数作为映射(dict)或2元组序列传递给urlencode()
,如:
>>> import urllib >>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'} >>> urllib.urlencode(f) 'eventName=myEvent&eventDescription=cool+event'
Python 2
你在找什么是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
在Python 3中, urllib
包被分解成更小的组件。 你将使用urllib.parse
(注意parse
子模块)
import urllib.parse urllib.parse.quote_plus(...)
上下文
- Python(版本2.7.2)
问题
- 你想要生成一个urlencoded查询string。
- 您有一个包含名称 – 值对的字典或对象。
- 您希望能够控制名称 – 值对的输出顺序。
解
- urllib.urlencode
- urllib.quote_plus
陷阱
- 字典输出名称 – 值对的任意sorting
- (另请参阅: 为什么python命令我的字典是这样的? )
- (另见: 为什么字典和集合中的顺序是随意的? )
- 处理不关心名称/值对的sorting的情况
- 处理你关心名称 – 值对的sorting的情况
- 处理单个名称需要在所有名称 – 值对集合中出现多次的情况
例
以下是一个完整的解决scheme,包括如何处理一些陷阱。
### ******************** ## 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,你不需要打扰urlencode!
import requests requests.get('http://youraddress.com', params=evt.fields)
编辑:
如果您需要命名的名称 – 值对或多个值作为名称然后像这样设置参数:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
而不是使用字典。
Python 3:
urllib.parse.quote_plus(string,safe ='',encoding = None,errors = None)
请注意,urllib.urlencode并不总是这样做的。 问题是一些服务关心的是参数的顺序,当你创build字典的时候这些参数会丢失。 对于这样的情况,urllib.quote_plus更好,正如Ricky所build议的那样。
尝试这个:
urllib.pathname2url(stringToURLEncode)
urlencode
将无法正常工作,因为它仅适用于字典。 quote_plus
没有产生正确的输出。
在Python 3中,这与我一起工作
import urllib urllib.parse.quote(query)
为将来的参考(例如:python3)
>>> import urllib.request as req >>> query = 'eventName=theEvent&eventDescription=testDesc' >>> req.pathname2url(query) >>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
urllib.urlencode()