Kamus Python ke Parameter URL

124

Saya mencoba untuk mengubah kamus Python menjadi string untuk digunakan sebagai parameter URL. Saya yakin ada cara yang lebih baik dan lebih Pythonic untuk melakukan ini. Apa itu?

x = ""
for key, val in {'a':'A', 'b':'B'}.items():
    x += "%s=%s&" %(key,val)
x = x[:-1]
kzh
sumber

Jawaban:

252

Gunakan urllib.urlencode(). Ini mengambil kamus pasangan nilai-kunci, dan mengubahnya menjadi bentuk yang sesuai untuk URL (misalnya, key1=val1&key2=val2).

Jika Anda menggunakan Python3, gunakan urllib.parse.urlencode()

Jika Anda ingin membuat URL dengan parameter berulang seperti: p=1&p=2&p=3Anda memiliki dua opsi:

>>> import urllib
>>> a = (('p',1),('p',2), ('p', 3))
>>> urllib.urlencode(a)
'p=1&p=2&p=3'

atau jika Anda ingin membuat url dengan parameter berulang:

>>> urllib.urlencode({'p': [1, 2, 3]}, doseq=True)
'p=1&p=2&p=3'
mipadi
sumber
4
jika Anda ingin membuat url dengan parameter berulang misalnya:? p = 1 & p = 2 & p = 3 lalu a = (('p', 1), ('p', 2), ('p', 3)); urllib.urlencode (a) hasilnya adalah 'p = 1 & p = 2 & p = 3'
panchicore
6
Cara lain untuk mendapatkan parameter berulang: urllib.urlencode ({'p': [1, 2, 3]}, doseq = True) menghasilkan 'p = 1 & p = 2 & p = 3'.
mbaechtold
Jika Anda bertanya-tanya tentang apa doeseqini: "Jika ada nilai dalam argumen kueri adalah urutan dan dosisq benar, setiap elemen urutan diubah ke parameter terpisah."
Martin Thoma
2

Gunakan furl pustaka manipulasi url Python pihak ketiga :

f = furl.furl('')
f.args = {'a':'A', 'b':'B'}
print(f.url) # prints ... '?a=A&b=B'

Jika Anda menginginkan parameter berulang, Anda dapat melakukan hal berikut:

f = furl.furl('')
f.args = [('a', 'A'), ('b', 'B'),('b', 'B2')]
print(f.url) # prints ... '?a=A&b=B&b=B2'
Mayank Jaiswal
sumber
Dimana saya bisa mendapatkan furl? Tampaknya bukan perpustakaan standar
AMADANON Inc.
1
pip install furlIni bukan bagian dari perpustakaan standar
Mayank Jaiswal
-7

Ini tampaknya sedikit lebih Pythonic bagi saya, dan tidak menggunakan modul lain:

x = '&'.join(["{}={}".format(k, v) for k, v in {'a':'A', 'b':'B'}.items()])
Tao Starbow
sumber
8
Ini tidak akan persen mengkodekan parameter dengan benar. Ini akan membuat hasil yang tidak terduga jika data Anda menyertakan ampersand, sama dengan, simbol hash, dll.
Jamie Cockburn