如何在url字符串中传入list变量,并在python

时间:2018-05-25 21:25:14

标签: python-3.x urllib

我需要格式化url字符串以便与urllib一起使用: 我想得到的网址字符串为:

http://localhost:8086/service/records/names?name=A,B,C,D,E,F,G

如果我使用

namelist = ['A','B','C','D','E','F','G']
url = 'http://localhost:8086/service/records/names?name={namelist}'.format(namelist=namelist}

然后我得到:

http://localhost:8086/service/records/names?name=['A','B','C','D','E','F','G']

那么如何通过传入一个字符串列表来格式化一个url字符串wihout“[]”?

4 个答案:

答案 0 :(得分:2)

将列表加入到包含...

的字符串中

'[insert seperator here]'.join(namelist)

所以在你的情况下

','.join(namelist) 这产生了A,B,C,D,E,F' ...

然后,您可以将初始方法与.format()

一起使用

答案 1 :(得分:2)

您的第一个选择是其他答案建议:自己创建逗号分隔列表,如下:

import urllib.parse
query_string = 'name=' + ','.join(namelist)
url = 'http://localhost:8086/service/records/names?{query_string}'.format(query_string=query_string)
# url == 'http://localhost:8086/service/records/names?name=A,B,C,D,E,F,G'

这符合您的要求,但它有一些限制:首先,如果您的某个名字有逗号,则无法正确转义。 其次,列表中的逗号和namelist中的其他字符将无法正确编码为URL。

您的第二个选项,即前一个选项的更强大版本,是对您的列表进行编码,如下所示:

import urllib.parse
query_params = {'name': ','.join(namelist)}
query_string = urllib.parse.urlencode(query_params)
url = 'http://localhost:8086/service/records/names?{query_string}'.format(query_string=query_string)
# url == 'http://localhost:8086/service/records/names?name=A%2CB%2CC%2CD%2CE%2CF%2CG'

这将正确地转义URL使用的字符,但您仍然需要手动汇编和解析查询字符串。

还有第三个选项,我建议:使用在查询字符串中传递列表的标准方法,即重复键。

import urllib.parse
query_params = {'name': namelist}
query_string = urllib.parse.urlencode(query_params, doseq=True)
url = 'http://localhost:8086/service/records/names?{query_string}'.format(query_string=query_string)
# url == 'http://localhost:8086/service/records/names?name=A&name=B&name=C&name=D&name=E&name=F&name=G'

最后一个选项,更冗长一点,但更强大,因为URL解析器将返回一个您不需要解析的列表。 此外,如果您的某个名称中有逗号,则会自动转义。

查看三个选项之间的区别:

>>> urllib.parse.parse_qs('name=A,B,C,D,E,F,G')
{'name': ['A,B,C,D,E,F,G']}
>>> urllib.parse.parse_qs('name=A%2CB%2CC%2CD%2CE%2CF%2CG')
{'name': ['A,B,C,D,E,F,G']}
>>> urllib.parse.parse_qs('name=A&name=B&name=C&name=D&name=E&name=F&name=G')
{'name': ['A', 'B', 'C', 'D', 'E', 'F', 'G']}

最后一个将更容易使用!

答案 2 :(得分:1)

.format(namelist=",".join(namelist))

将在列表条目之间使用“,”工作

答案 3 :(得分:1)

除了其他答案之外:你还可以使用Python 3的漂亮F-string feature。它比.format() imo更漂亮,并提醒你其他允许变量的编程语言内插。

namelist = ['A','B','C','D','E','F','G']
url = f"http://localhost:8086/service/records/names?name={','.join(namelist)}"

print(url)
# http://localhost:8086/service/records/names?name=A,B,C,D,E,F,G