Python'da bir sözlüğü sorgu dizesine nasıl dönüştürebilirim?


Yanıtlar:


158

Python 3

urllib.parse.urlencode(sorgu, dozq = Yanlış, [...])

Dönüştürme bir eşleme nesne veya str içeren ya da yüzde olarak kodlanmış bir ASCII metin dizesine, nesneleri bayt olabilir, iki eleman dizilerini, bir dizi.

- Python 3 urllib.parsebelgeleri

A dictbir eşlemedir.

Eski Python

urllib.urlencode( query[ doseq])
Dönüştürme bir eşleme nesnesi ya da bir “yüzde olarak kodlanmış” dizge iki öğeli dizilerini bir dizi ... bir dizi key=valueçifti ile ayrılmış '&'karakterler ...

- Python 2.7 urllibbelgeleri


1
Bu doğrudur, ancak dicttarafından döndürülen cgi.parse_qs()aslında list"değerleri" olarak s'ye sahiptir . Bunları doğrudan aktarmak, çok garip görünen sorgu dizelerine neden olacaktır.
Johnsyweb

Yeterince doğru. Bu bana ilk cümleden daha fazlasını okumayı öğretecek!
Johnsyweb


Sorun, urlencode'un alanı + 'ya dönüştürebilmesidir ki bu önerilmez.
user1633272

1
@ user1633272: Kime göre tavsiye edilmez?
Ignacio Vazquez-Abrams

67

Python3'te biraz farklı:

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

çıktı: 'pram1=foo&param2=bar'

python2 ve python3 uyumluluğu için şunu deneyin:

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

7

Tam olarak buna benzer bir şey arıyorsunuz urllib.urlencode()!

Ancak, aradığınızda parse_qs()(ondan farklı parse_qsl()), sözlük anahtarları benzersiz sorgu değişken adlarıdır ve değerler , her ad için değer listeleridir .

Bu bilgileri içeri aktarmak için urllib.urlencode(), bu listeleri "düzleştirmelisiniz". İşte tuple'ların bir liste anlayışı ile bunu nasıl yapabileceğiniz:

query_pairs = [(k,v) for k,vlist in d.iteritems() for v in vlist]
urllib.urlencode(query_pairs)

16
Ya da geçebilirsin doseq=True.
Ignacio Vazquez-Abrams

@downvoter: Bu yanıtı nasıl geliştirebilirim? Yazdığımdan bu yana altı yıl geçti!
Johnsyweb

-1

Belki böyle bir şey arıyorsunuz:

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

Bir sözlük alır ve onu urlencode gibi bir sorgu dizesine dönüştürür. Sorgu dizesine son bir "&" ekler, ancak bir return query[:-1]sorunsa bunu düzeltir.


4
str.join()Henüz tanışmadın mı ? Nasıl olur urllib.quote_plus()?
Ignacio Vazquez-Abrams

1
@garbados Çözümünüz basit durumlarda çalışmalıdır. Ancak, bir göz urlencodeiçinde urllib.pyneden bir sorgu dizesi Cevabınız özellikle (gereğini anlaşılacağı gibi oldukça basit olarak bazen değildir oluştururken görmek için (sizin Python ile yüklemeniz gerekir) için 'alıntı' a geçerli olmayan bazı karakterler URL). @Ignacio, uygulamanızı temizleyecek ve düzeltecek iki işleve de başvurmuştur.
Anthony Kramp

Ah, gerçekten. Kaba uygulama için özür dilerim. Kendimle hiç karşılaşmadığım soruları daha dikkatli yanıtlamam gerektiğini gösterecek.
garbados

Bu en iyi cevap olmasa da, bu sorunun başlığına tıkladığımda tam olarak görmek istediğim şey buydu. Bir diktede '&' ile ayrılmış bir isim = değer çiftine dönüştürmem gereken sadece 4 öğe var. Değerlerim kontrol ediliyor. Str.join () benim durumumda kullanışlıdır, ancak yine quote_plus () 'a ihtiyacım yok çünkü halka açık kod değil :) Teşekkürler!
harperville

1
@harperville, ancak daha doğru yol ( from urllib.parse import urlencode; urlencode(your_dict)) bundan daha kısa ve daha kolaydır! Mevcut, iyi tasarlanmış tekerleklere erişmek pahalı veya elverişsiz olduğunda bazen tekerleği yeniden icat etmenin akıllıca olduğunu kabul edeceğim, ancak burada kullanıma hazır tekerleği kullanmak, kendi aşağı olanı yuvarlamaktan daha kolay ve daha hızlıdır. .
Mark Amery
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.