2011-10-18 93 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 
相关问题