如何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()