送信する前に、この文字列をURLエンコードしようとしています。
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 3以上
つかいます:
>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event
これはnotが一般的に使われている意味でURLエンコードをすることに注意してください(出力を見てください)。そのためにはurllib.parse.quote_plus
を使います。
お探しのものは 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では、urllib
パッケージは小さなコンポーネントに分割されました。 urllib.parse.quote_plus
を使用します(parse
子モジュールに注意してください)。
import urllib.parse
urllib.parse.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" : "[email protected]",
}
### ********************
## 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の代わりに requests を試してください。あなたはurlencodeを気にする必要はありません。
import requests
requests.get('http://youraddress.com', params=evt.fields)
編集:
順序付けられた名前と値のペア または名前に複数の値が必要な場合は、次のようにparamsを設定します。
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
辞書を使う代わりに。
Urllib.urlencodeが常にうまくいくとは限らないことに注意してください。問題は、一部のサービスは引数の順序を気にすることです。これは、辞書を作成すると失われます。そのような場合には、Rickyが示唆しているように、urllib.quote_plusの方が優れています。
これを試して:
urllib.pathname2url(stringToURLEncode)
urlencode
は辞書でしか機能しないので機能しません。 quote_plus
は正しい出力を生成しませんでした。
Python 3では、これは私と一緒に働きました
import urllib
urllib.parse.quote(query)
将来の参考のために(ex:for python3)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
構文 は次のとおりです。
import urllib3
urllib3.request.urlencode({"user" : "john" })
Python 2と3の両方をサポートする必要があるスクリプト/プログラムで使用するために、6つのモジュールはquoteと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'
まだ言及されていないかもしれないもう1つのことは、urllib.urlencode()
が辞書の空の値を文字列None
としてエンコードすることです。これが通常望ましいのかどうかはわかりませんが、私のユースケースには合いません。したがって、quote_plus
を使用する必要があります。