Python, ters işlev urllib.urlencode


89

urllib.urlencodeİşlendikten sonra verileri nasıl dikteye dönüştürebilirim ? urllib.urldecodemevcut değil.

Yanıtlar:


126

Gibi dokümanlar için urlencodesöz hakkından,

Urlparse modülü, sorgu dizelerini Python veri yapılarına ayrıştırmak için kullanılan parse_qs () ve parse_qsl () işlevlerini sağlar.

(Eski Python sürümlerinde cgimodülün içindeydiler ). Yani mesela:

>>> 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']}

Orijinal sözlük dile "gidiş geliş" arasındaki bariz fark d1, ikincisinin (bu durumda tek öğeli) listelere sahip olmasıdır - bunun nedeni, sorgu dizelerinde benzersizlik garantisi olmaması ve önemli olabilir. uygulamanıza her anahtar için hangi birden çok değerin verildiğini bilmek için (yani, listeler her zaman tek öğeli olanlar olmayacaktır ;-).

Alternatif olarak:

>>> sq = urlparse.parse_qsl(s)
>>> sq  
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

bir çift dizisi elde edebilirsiniz (urlencode böyle bir argümanı da kabul eder - bu durumda sırayı korurken, dikte durumunda ;-) korunacak bir sıra yoktur. Yinelenen "anahtarlar" olmadığını biliyorsanız veya varsa, umursamıyorsanız, o zaman (gösterdiğim gibi) dictliste dışı değerler içeren bir sözlük almak için arayabilirsiniz . Genel olarak, ancak, çiftleri eğer ne yapmak istediğinizi düşünün gereğini yapmak vardır (Python sizin adınıza ;-) o karar vermez mevcut.


1
Çok kapsamlı cevap. Harika!
Hartley Brody

1
Python 2 için artı oy, ancak Python 3 urllibmodülün içinde. @Phobie cevabına bakın.
openwonk

19

Alex'in çözümü için Python 3 kodu :

>>> 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']}

Alternatif:

>>> sq = urllib.parse.parse_qsl(s)
>>> sq
[('a', 'b'), ('c', 'd')]
>>> dict(sq)
{'a': 'b', 'c': 'd'}

parse_qsl tersine çevrilebilir:

>>> urllib.parse.urlencode(sq)
'a=b&c=d'

16

urllib.unquote_plus()ne istersen yapar. % Xx çıkışlarını tek karakterlik eşdeğerleriyle değiştirir ve artı işaretlerini boşluklarla değiştirir.

Misal:

unquote_plus('/%7Ecandidates/?name=john+connolly') 

verim

'/~candidates/?name=john connolly'.

2
Bir buyruk istediğini söyledi. Yani cevabınız yanlış.
balrok

4
yay, aradığım buydu.
Joe
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.