2011-10-18 131 views
67

使用cgi.parse_qs()後,如何將結果(字典)轉換回查詢字符串?尋找類似urllib.urlencode()的東西。如何將字典轉換爲Python中的查詢字符串?

+5

注意:['cgi.parse_qs()'已被棄用。使用urlparse.parse_qs()代替。](http://docs.python.org/library/cgi.html#cgi.parse_qs) – Johnsyweb

+0

**另請參閱:** https://stackoverflow.com/questions/5607551/ how to urlencode-a-querystring-in-python – dreftymac

回答

113

the docs來自:

urllib.urlencodequery [,doseq])
轉換的映射對象或兩個元素的元組的,以「百分比編碼」的字符串的序列...一系列的key=value雙通過'&'字符分隔...

dict是一個映射。

+0

這是真的,但'cgi.parse_qs()'返回的'dict'實際上具有'list'作爲它的「值」。直接傳遞這些將導致查詢字符串非常奇怪。 – Johnsyweb

+5

正如文檔所說,這就是'doseq'的用途。 –

+0

夠正確。這會教會我閱讀比第一句更多的東西! – 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()'怎麼樣? –

+1

@garbados您的解決方案應該在簡單的情況下工作。但是,在'urllib中看看'urlencode'。py'(它應該在你的Python安裝中)看看爲什麼創建一個查詢字符串有時候不像你的答案所暗示的那麼簡單(特別是需要引用某些在URL中無效的字符)。 @Ignacio還引用了兩個函數來清理你的實現並使其正確。 –

+0

啊,的確如此。抱歉的實施。要表明我應該更加小心地回答我從未面對過的問題。 – garbados

4

您正在尋找東西正好urllib.urlencode()

然而,當你調用parse_qs()(不同於parse_qsl()),字典鍵是唯一的查詢變量名和值是每個名稱值的名單。

爲了將此信息傳遞到urllib.urlencode(),您必須「扁平化」這些列表。這裏是你如何可以與一個元組列表comprehenshion做到這一點:

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

或者您可以通過'doseq = True'。 –

+5

或者我可以閱讀文檔並做到這一點!是的:-) – Johnsyweb

+0

@downvoter:我怎麼能改善這個答案?我寫這篇文章已經六年了! – Johnsyweb

27

在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 
相關問題