หลังจากใช้cgi.parse_qs()
แล้วจะแปลงผลลัพธ์ (พจนานุกรม) กลับเป็นสตริงการสืบค้นได้อย่างไร กำลังมองหาสิ่งที่คล้ายกับ urllib.urlencode()
.
หลังจากใช้cgi.parse_qs()
แล้วจะแปลงผลลัพธ์ (พจนานุกรม) กลับเป็นสตริงการสืบค้นได้อย่างไร กำลังมองหาสิ่งที่คล้ายกับ urllib.urlencode()
.
คำตอบ:
urllib.parse.
urlencode
(ข้อความค้นหา doseq = False, [... ])แปลงอ็อบเจ็กต์การแมปหรือลำดับของทูเพิลสององค์ประกอบซึ่งอาจมีอ็อบเจ็กต์ str หรือ bytes เป็นสตริงข้อความ ASCII ที่เข้ารหัสเปอร์เซ็นต์
A dict
คือการทำแผนที่
urllib.urlencode
(query
[,doseq
])
แปลงวัตถุการแมปหรือลำดับของสิ่งสององค์ประกอบเป็นสตริง "เข้ารหัสเปอร์เซ็นต์" ... ชุดของkey=value
คู่ที่คั่นด้วย'&'
อักขระ ...
dict
ส่งคืนโดยcgi.parse_qs()
แท้จริงมีlist
s เป็น "ค่า" ของมัน การส่งผ่านสิ่งเหล่านี้โดยตรงจะส่งผลให้สตริงการสืบค้นดูแปลกมาก
ใน python3 แตกต่างกันเล็กน้อย:
from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})
เอาต์พุต: 'pram1=foo¶m2=bar'
สำหรับความเข้ากันได้ของ python2 และ python3 ลองสิ่งนี้:
try:
#python2
from urllib import urlencode
except ImportError:
#python3
from urllib.parse import urlencode
คุณกำลังมองหาบางสิ่งบางอย่างว่าเหมือนurllib.urlencode()
!
อย่างไรก็ตามเมื่อคุณเรียกparse_qs()
(แตกต่างจากparse_qsl()
) คีย์พจนานุกรมคือชื่อตัวแปรคิวรีที่ไม่ซ้ำกันและค่าจะเป็นรายการของค่าสำหรับแต่ละชื่อ
ในการส่งข้อมูลนี้ไปurllib.urlencode()
คุณต้อง "แบน" รายการเหล่านี้ นี่คือวิธีที่คุณสามารถทำได้ด้วยการทำความเข้าใจรายการของสิ่งทู:
query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)
doseq=True
หรือคุณอาจจะผ่าน
บางทีคุณอาจกำลังมองหาสิ่งนี้:
def dictToQuery(d):
query = ''
for key in d.keys():
query += str(key) + '=' + str(d[key]) + "&"
return query
ใช้พจนานุกรมและแปลงเป็นสตริงการสืบค้นเช่นเดียวกับ urlencode มันจะเพิ่ม "&" สุดท้ายต่อท้ายสตริงข้อความค้นหา แต่จะreturn query[:-1]
แก้ไขได้หากเป็นปัญหา
str.join()
รึยัง? แล้วไงurllib.quote_plus()
?
urlencode
ในurllib.py
(ควรโดยในหลามของคุณติดตั้ง) เพื่อดูว่าทำไมการสร้างสตริงแบบสอบถามเป็นบางครั้งไม่ได้ค่อนข้างเป็นง่ายๆเป็นคำตอบของคุณหมายถึง (โดยเฉพาะอย่างยิ่งความจำเป็นที่จะ 'อ้าง' ตัวอักษรบางอย่างที่ไม่ถูกต้องใน URL) @Ignacio ได้อ้างถึงฟังก์ชันสองอย่างที่จะล้างการใช้งานของคุณและทำให้ถูกต้อง
from urllib.parse import urlencode; urlencode(your_dict)
) สั้นและง่ายกว่านี้! ฉันจะให้สิทธิ์ว่าบางครั้งมันก็ฉลาดที่จะสร้างล้อขึ้นมาใหม่แม้ว่าจะมีราคาแพงหรือไม่สะดวกในการเข้าถึงล้อที่มีอยู่และได้รับการออกแบบมาอย่างดี แต่ที่นี่การใช้ล้อนอกชั้นนั้นง่ายกว่าและเร็วกว่าการหมุนล้อที่ด้อยกว่าของคุณเอง .
cgi.parse_qs()
เลิกใช้แล้ว ใช้ urlparse.parse_qs () แทน