如何在Python中注入URL查询字符串参数?

时间:2012-04-27 13:53:46

标签: python query-string

我想为组织网站的任何网址撰写一个等效的调试网址。我有Python函数来执行此操作:

import urlparse
import urllib

def compose_debug_url(input_url):
    input_url_parts = urlparse.urlsplit(input_url)
    input_query = input_url_parts.query
    input_query_dict = urlparse.parse_qs(input_query)

    modified_query_dict = dict(input_query_dict.items() + [('debug', 'sp')])
    modified_query = urllib.urlencode(modified_query_dict)
    modified_url_parts = (
      input_url_parts.scheme,
      input_url_parts.netloc,
      input_url_parts.path,
      modified_query,
      input_url_parts.fragment
    )

    modified_url = urlparse.urlunsplit(modified_url_parts)

    return modified_url



print compose_debug_url('http://www.example.com/content/page?name=john&age=35')
print compose_debug_url('http://www.example.com/')

如果您运行上面的代码,您应该看到输出:

http://www.example.com/content/page?debug=sp&age=%5B%2735%27%5D&name=%5B%27john%27%5D
http://www.example.com/?debug=sp

相反,我希望:

http://www.example.com/content/page?debug=sp&age=35&name=john
http://www.example.com/?debug=sp

这是因为urlparse.parse_qs将字符串的dict返回到列表而不是字符串到字符串的字典。

有没有其他方法可以更简单地在Python中执行此操作?

2 个答案:

答案 0 :(得分:1)

urlparse.parse_qs会为每个键返回值列表。在你的例子中它是 {'age': ['35'], 'name': ['john']},而您想要的是{'age': '35', 'name': 'john'}

由于您使用key,value pars作为列表,因此请使用urlparse.parse_qsl

modified_query_dict = dict(urlparse.parse_qsl(input_query) + [('debug', 'sp')])

答案 1 :(得分:1)

延迟回答,但urlencode采用doseq参数,可用于展平列表。