Jawaban:
Anda perlu memasukkan parameter Anda urlencode()
sebagai pemetaan (dict), atau urutan 2-tupel, seperti:
>>> import urllib
>>> f = { 'eventName' : 'myEvent', 'eventDescription' : 'cool event'}
>>> urllib.urlencode(f)
'eventName=myEvent&eventDescription=cool+event'
Python 3 atau lebih tinggi
Menggunakan:
>>> urllib.parse.urlencode(f)
eventName=myEvent&eventDescription=cool+event
Perhatikan bahwa ini tidak melakukan penyandian url dalam arti yang umum digunakan (lihat outputnya). Untuk itu gunakan urllib.parse.quote_plus
.
Apa yang Anda cari adalah 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'
Dalam Python 3, urllib
paket telah dipecah menjadi komponen yang lebih kecil. Anda akan menggunakan urllib.parse.quote_plus
(perhatikan parse
modul anak)
import urllib.parse
urllib.parse.quote_plus(...)
import urllib.parse ... urllib.parse.quote_plus(query)
python3 -c "import urllib.parse, sys; print(urllib.parse.quote_plus(sys.argv[1])) "string to encode"
untuk satu liner di baris perintah
Coba permintaan alih-alih urllib dan Anda tidak perlu repot dengan urlencode!
import requests
requests.get('http://youraddress.com', params=evt.fields)
EDIT:
Jika Anda membutuhkan pasangan nama-nilai yang dipesan atau beberapa nilai untuk sebuah nama, maka tetapkan params seperti ini:
params=[('name1','value11'), ('name1','value12'), ('name2','value21'), ...]
alih-alih menggunakan kamus.
Berikut ini adalah solusi lengkap, termasuk bagaimana menghadapi beberapa jebakan.
### ********************
## 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.parse.quote()
diri saya sendiri karena menggunakan %20
daripada +
.
Coba ini:
urllib.pathname2url(stringToURLEncode)
urlencode
tidak akan berfungsi karena hanya berfungsi pada kamus. quote_plus
tidak menghasilkan output yang benar.
my string
ke my%20string
. Solusi Anda bekerja seperti pesona untuk itu!
%20
alih-alih +
. Terima kasih
Perhatikan bahwa urllib.urlencode tidak selalu berhasil. Masalahnya adalah bahwa beberapa layanan peduli dengan urutan argumen, yang hilang ketika Anda membuat kamus. Untuk kasus seperti itu, urllib.quote_plus lebih baik, seperti yang disarankan Ricky.
>>> import urllib >>> urllib.urlencode([('name', 'brandon'), ('uid', 1000)]) 'name=brandon&uid=1000'
untuk referensi di masa mendatang (mis: untuk python3)
>>> import urllib.request as req
>>> query = 'eventName=theEvent&eventDescription=testDesc'
>>> req.pathname2url(query)
>>> 'eventName%3DtheEvent%26eventDescription%3DtestDesc'
'c:/2 < 3'
pada Windows adalah '///C://2%20%3C%203'
. Saya ingin sesuatu yang hanya keluaran 'c:/2%20%3C%203'
.
Untuk digunakan dalam skrip / program yang perlu mendukung python 2 dan 3, modul enam menyediakan fungsi quote dan 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'
The sintaks adalah sebagai berikut:
import urllib3
urllib3.request.urlencode({"user" : "john" })
Hal lain yang mungkin belum disebutkan adalah bahwa urllib.urlencode()
akan menyandikan nilai kosong dalam kamus sebagai None
ganti parameter yang tidak ada. Saya tidak tahu apakah ini biasanya diinginkan atau tidak, tetapi tidak cocok dengan kasus penggunaan saya, maka saya harus menggunakannya quote_plus
.
Untuk Python 3 urllib3 berfungsi dengan baik, Anda dapat menggunakan sebagai berikut sesuai dokumen resmi :
import urllib3
http = urllib3.PoolManager()
response = http.request(
'GET',
'https://api.prylabs.net/eth/v1alpha1/beacon/attestations',
fields={ # here fields are the query params
'epoch': 1234,
'pageSize': pageSize
}
)
response = attestations.data.decode('UTF-8')