Python Dictionary เป็นพารามิเตอร์ URL


124

ฉันกำลังพยายามแปลงพจนานุกรม Python เป็นสตริงเพื่อใช้เป็นพารามิเตอร์ URL ฉันแน่ใจว่ามีวิธีที่ดีกว่าPythonicมากกว่านี้ในการทำเช่นนี้ มันคืออะไร?

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

คำตอบ:


252

ใช้urllib.urlencode(). ใช้พจนานุกรมคู่คีย์ - ค่าและแปลงเป็นรูปแบบที่เหมาะสมกับ URL (เช่นkey1=val1&key2=val2)

หากคุณใช้ Python3 ให้ใช้ urllib.parse.urlencode()

หากคุณต้องการสร้าง URL ที่มีพารามิเตอร์ซ้ำ ๆ กันเช่น: p=1&p=2&p=3คุณมีสองตัวเลือก:

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

หรือถ้าคุณต้องการสร้าง url ด้วยพารามิเตอร์ซ้ำ ๆ :

>>> urllib.urlencode({'p': [1, 2, 3]}, doseq=True)
'p=1&p=2&p=3'

4
หากคุณต้องการสร้าง url ที่มีพารามิเตอร์ซ้ำ ๆ กันเช่น? p = 1 & p = 2 & p = 3 แล้ว a = (('p', 1), ('p', 2), ('p', 3)); urllib.urlencode (a) ผลลัพธ์คือ 'p = 1 & p = 2 & p = 3'
panchicore

6
อีกวิธีหนึ่งในการรับพารามิเตอร์ซ้ำ: urllib.urlencode ({'p': [1, 2, 3]}, doseq = True) ซึ่งส่งผลให้ 'p = 1 & p = 2 & p = 3'
mbaechtold

หากคุณสงสัยว่าdoeseqเกี่ยวกับอะไร: "หากค่าใด ๆ ในอาร์กิวเมนต์การค้นหาเป็นลำดับและ doseq เป็นจริงองค์ประกอบลำดับแต่ละรายการจะถูกแปลงเป็นพารามิเตอร์แยกต่างหาก"
Martin Thoma

2

ใช้furlไลบรารีการจัดการ URL Python ของบุคคลที่สาม:

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

หากคุณต้องการพารามิเตอร์ซ้ำ ๆ คุณสามารถทำสิ่งต่อไปนี้:

f = furl.furl('')
f.args = [('a', 'A'), ('b', 'B'),('b', 'B2')]
print(f.url) # prints ... '?a=A&b=B&b=B2'

ฉันจะขนได้ที่ไหน? ดูเหมือนจะไม่ใช่ห้องสมุดมาตรฐาน
AMADANON Inc.

1
pip install furlไม่ใช่ส่วนหนึ่งของห้องสมุดมาตรฐาน
Mayank Jaiswal

-7

ดูเหมือนว่า Pythonic จะมากกว่าสำหรับฉันและไม่ได้ใช้โมดูลอื่น ๆ :

x = '&'.join(["{}={}".format(k, v) for k, v in {'a':'A', 'b':'B'}.items()])

8
สิ่งนี้จะไม่เข้ารหัสเปอร์เซ็นต์พารามิเตอร์อย่างถูกต้อง สิ่งนี้จะสร้างผลลัพธ์ที่ไม่คาดคิดหากข้อมูลของคุณมีเครื่องหมายแอมเพอร์แซนด์เท่ากับสัญลักษณ์แฮช ฯลฯ
Jamie Cockburn
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.