web-dev-qa-db-ja.com

Pythonでクエリ文字列をurlencodeする方法は?

送信する前に、この文字列をURLエンコードしようとしています。

queryString = 'eventName=' + evt.fields["eventName"] + '&' + 'eventDescription=' + evt.fields["eventDescription"]; 
491
James

次のように、マッピング(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を使います。

490
bgporter

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.quote_plus を使用します(parse子モジュールに注意してください)。

import urllib.parse
urllib.parse.quote_plus(...)
939
Ricky

コンテキスト

  • Python(バージョン2.7.2)

問題

  • URLエンコードされたクエリ文字列を生成します。
  • 名前と値のペアを含む辞書またはオブジェクトがあります。
  • 名前と値のペアの出力順序を制御できるようにします。

溶液

  • urllib.urlencode
  • urllib.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
  """ 
37
dreftymac

Urllibの代わりに requests を試してください。あなたはurlencodeを気にする必要はありません。

import requests
requests.get('http://youraddress.com', params=evt.fields)

編集:

順序付けられた名前と値のペア または名前に複数の値が必要な場合は、次のようにparamsを設定します。

params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]

辞書を使う代わりに。

37
25
Janus Troelsen

Urllib.urlencodeが常にうまくいくとは限らないことに注意してください。問題は、一部のサービスは引数の順序を気にすることです。これは、辞書を作成すると失われます。そのような場合には、Rickyが示唆しているように、urllib.quote_plusの方が優れています。

21
user411279

これを試して:

urllib.pathname2url(stringToURLEncode)

urlencodeは辞書でしか機能しないので機能しません。 quote_plusは正しい出力を生成しませんでした。

21
Charlie

Python 3では、これは私と一緒に働きました

import urllib

urllib.parse.quote(query)
7
Mazen Aly

将来の参考のために(ex:for python3)

>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
5
nickanor

Urllib.parse.urlencode()がエラーを出している場合は、urllib3モジュールを試してください。

構文 は次のとおりです。

import urllib3
urllib3.request.urlencode({"user" : "john" }) 
2
Natesh bhat

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
bschlueter

まだ言及されていないかもしれないもう1つのことは、urllib.urlencode()が辞書の空の値を文字列Noneとしてエンコードすることです。これが通常望ましいのかどうかはわかりませんが、私のユースケースには合いません。したがって、quote_plusを使用する必要があります。

0
Joseph