วิธีการแปลงพจนานุกรมเป็นสตริงการสืบค้นใน Python


115

หลังจากใช้cgi.parse_qs()แล้วจะแปลงผลลัพธ์ (พจนานุกรม) กลับเป็นสตริงการสืบค้นได้อย่างไร กำลังมองหาสิ่งที่คล้ายกับ urllib.urlencode().



ดูเพิ่มเติม: stackoverflow.com/questions/5607551/…
dreftymac

คำตอบ:


161

Python 3

urllib.parse.urlencode(ข้อความค้นหา doseq = False, [... ])

แปลงอ็อบเจ็กต์การแมปหรือลำดับของทูเพิลสององค์ประกอบซึ่งอาจมีอ็อบเจ็กต์ str หรือ bytes เป็นสตริงข้อความ ASCII ที่เข้ารหัสเปอร์เซ็นต์

- เอกสารPython 3urllib.parse

A dictคือการทำแผนที่

Python ดั้งเดิม

urllib.urlencode( query[, doseq])
แปลงวัตถุการแมปหรือลำดับของสิ่งสององค์ประกอบเป็นสตริง "เข้ารหัสเปอร์เซ็นต์" ... ชุดของkey=valueคู่ที่คั่นด้วย'&'อักขระ ...

- Python 2.7 urllibเอกสาร


1
นี่เป็นความจริง แต่สิ่งที่dictส่งคืนโดยcgi.parse_qs()แท้จริงมีlists เป็น "ค่า" ของมัน การส่งผ่านสิ่งเหล่านี้โดยตรงจะส่งผลให้สตริงการสืบค้นดูแปลกมาก
Johnsyweb

จริงเพียงพอ นั่นจะสอนให้ฉันอ่านมากกว่าประโยคแรก!
Johnsyweb


1
ปัญหาคือ urlencode จะแปลง space เป็น + ซึ่งไม่แนะนำ
user1633272

1
@ user1633272: ไม่แนะนำตามใคร
Ignacio Vazquez-Abrams

69

ใน python3 แตกต่างกันเล็กน้อย:

from urllib.parse import urlencode
urlencode({'pram1': 'foo', 'param2': 'bar'})

เอาต์พุต: 'pram1=foo&param2=bar'

สำหรับความเข้ากันได้ของ python2 และ python3 ลองสิ่งนี้:

try:
    #python2
    from urllib import urlencode
except ImportError:
    #python3
    from urllib.parse import urlencode

7

คุณกำลังมองหาบางสิ่งบางอย่างว่าเหมือน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)

17
doseq=Trueหรือคุณอาจจะผ่าน
Ignacio Vazquez-Abrams

@downvoter: ฉันจะปรับปรุงคำตอบนี้ได้อย่างไร เป็นเวลาหกปีแล้วที่ฉันเขียนมัน!
Johnsyweb

-1

บางทีคุณอาจกำลังมองหาสิ่งนี้:

def dictToQuery(d):
  query = ''
  for key in d.keys():
    query += str(key) + '=' + str(d[key]) + "&"
  return query

ใช้พจนานุกรมและแปลงเป็นสตริงการสืบค้นเช่นเดียวกับ urlencode มันจะเพิ่ม "&" สุดท้ายต่อท้ายสตริงข้อความค้นหา แต่จะreturn query[:-1]แก้ไขได้หากเป็นปัญหา


4
เจอกันstr.join()รึยัง? แล้วไงurllib.quote_plus()?
Ignacio Vazquez-Abrams

1
@garbados วิธีแก้ปัญหาของคุณควรใช้ในกรณีง่ายๆ แต่ได้ดูurlencodeในurllib.py(ควรโดยในหลามของคุณติดตั้ง) เพื่อดูว่าทำไมการสร้างสตริงแบบสอบถามเป็นบางครั้งไม่ได้ค่อนข้างเป็นง่ายๆเป็นคำตอบของคุณหมายถึง (โดยเฉพาะอย่างยิ่งความจำเป็นที่จะ 'อ้าง' ตัวอักษรบางอย่างที่ไม่ถูกต้องใน URL) @Ignacio ได้อ้างถึงฟังก์ชันสองอย่างที่จะล้างการใช้งานของคุณและทำให้ถูกต้อง
Anthony Cramp

อาแน่นอน ขออภัยสำหรับการใช้งานที่น่าเบื่อ ไปแสดงให้เห็นว่าฉันควรระมัดระวังในการตอบคำถามที่ฉันไม่เคยเจอมาก่อน
garbados

แม้ว่านี่อาจไม่ใช่คำตอบที่ดีที่สุด แต่ก็เป็นสิ่งที่ฉันต้องการเห็นเมื่อคลิกที่ชื่อคำถามนี้ ฉันมีเพียง 4 รายการในคำสั่งที่ฉันต้องเปลี่ยนเป็นคู่ชื่อ = ค่าที่คั่นด้วย '&' ค่าของฉันถูกควบคุม str.join () มีประโยชน์ในกรณีของฉัน แต่ฉันไม่ต้องการ quote_plus () อีกต่อไปเพราะไม่ใช่รหัสที่เปิดเผยต่อสาธารณะ :) ขอบคุณ!
harperville

1
@harperville แต่วิธีที่ถูกต้องกว่า ( from urllib.parse import urlencode; urlencode(your_dict)) สั้นและง่ายกว่านี้! ฉันจะให้สิทธิ์ว่าบางครั้งมันก็ฉลาดที่จะสร้างล้อขึ้นมาใหม่แม้ว่าจะมีราคาแพงหรือไม่สะดวกในการเข้าถึงล้อที่มีอยู่และได้รับการออกแบบมาอย่างดี แต่ที่นี่การใช้ล้อนอกชั้นนั้นง่ายกว่าและเร็วกว่าการหมุนล้อที่ด้อยกว่าของคุณเอง .
Mark Amery
โดยการใช้ไซต์ของเรา หมายความว่าคุณได้อ่านและทำความเข้าใจนโยบายคุกกี้และนโยบายความเป็นส่วนตัวของเราแล้ว
Licensed under cc by-sa 3.0 with attribution required.