ฉันจะแปลงข้อมูลหลังจากประมวลผลurllib.urlencode
เป็น dict ได้อย่างไร
urllib.urldecode
ไม่ได้อยู่.
ฉันจะแปลงข้อมูลหลังจากประมวลผลurllib.urlencode
เป็น dict ได้อย่างไร
urllib.urldecode
ไม่ได้อยู่.
คำตอบ:
ในฐานะที่เป็นเอกสารสำหรับการurlencode
พูด
โมดูล urlparse จัดเตรียมฟังก์ชัน parse_qs () และ parse_qsl () ซึ่งใช้เพื่อแยกวิเคราะห์สตริงการสืบค้นลงในโครงสร้างข้อมูล Python
(ใน Python รุ่นเก่ากว่าจะอยู่ในcgi
โมดูล) ตัวอย่างเช่น:
>>> import urllib
>>> import urlparse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urlparse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}
ความแตกต่างที่เห็นได้ชัดระหว่างพจนานุกรมเดิมd
และ "รอบสะดุด" คนหนึ่งd1
เป็นที่หลังมี (รายการเดียวในกรณีนี้) รายการเป็นค่า - นั่นเป็นเพราะไม่มีการรับประกันเอกลักษณ์ในสตริงแบบสอบถามและมันอาจจะเป็นสิ่งสำคัญ ไปยังแอปของคุณเพื่อทราบว่ามีการกำหนดค่าหลายค่าสำหรับแต่ละคีย์ (นั่นคือรายการจะไม่เป็นรายการเดียวเสมอไป ;-)
เป็นทางเลือก:
>>> sq = urlparse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}
คุณสามารถหาลำดับคู่ได้ (urlencode ยอมรับอาร์กิวเมนต์เช่นกัน - ในกรณีนี้จะรักษาคำสั่งในขณะที่ในกรณี dict ไม่มีคำสั่งให้เก็บรักษา ;-) หากคุณทราบว่าไม่มี "คีย์" ที่ซ้ำกันหรือไม่สนใจว่าจะมีหรือไม่ (ตามที่ฉันแสดง) คุณสามารถเรียกdict
พจนานุกรมที่มีค่าที่ไม่ใช่รายการได้ อย่างไรก็ตามโดยทั่วไปคุณต้องพิจารณาว่าคุณต้องการทำอะไรหากมีรายการที่ซ้ำกันอยู่ (Python ไม่ได้ตัดสินใจในนามของคุณ ;-)
urllib
โมดูล ดูคำตอบของ @phobie
รหัส Python 3สำหรับโซลูชันของ Alex:
>>> import urllib.parse
>>> d = {'a':'b', 'c':'d'}
>>> s = urllib.parse.urlencode(d)
>>> s
'a=b&c=d'
>>> d1 = urllib.parse.parse_qs(s)
>>> d1
{'a': ['b'], 'c': ['d']}
ทางเลือก:
>>> sq = urllib.parse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}
parse_qsl สามารถย้อนกลับได้:
>>> urllib.parse.urlencode(sq)
'a=b&c=d'
urllib.unquote_plus()
ทำในสิ่งที่คุณต้องการ มันจะแทนที่% xx Escape ด้วยอักขระตัวเดียวที่เทียบเท่าและแทนที่เครื่องหมายบวกด้วยช่องว่าง
ตัวอย่าง:
unquote_plus('/%7Ecandidates/?name=john+connolly')
ผลตอบแทน
'/~candidates/?name=john connolly'.