Python使用urljoin拼接URL时查询参数填充错位问题排查
问题排查
你的代码一共有3处错误,直接导致输出不符合预期:
- 字符串格式化范围错误:
.format(a,start,end)仅作用于最后拼接的"&start={}&end={}"片段,前面所有terms[]={}占位符没有被填充,会原样保留{}符号。 - 搜索词分割逻辑不匹配:代码里写的是按逗号
split(",",num_terms)分割搜索词,但你实际测试输入的搜索词是用空格分隔的ty ou io,分割后得到的列表a只有1个元素['ty ou io'],和输入的搜索词总数量3不匹配。 - 格式化参数数量、顺序错误:3个搜索词+start、end一共需要5个占位符对应的值,但你仅传入了列表
a、start、end3个参数,参数数量不足,且直接传入列表会把列表的整串表示填充到第一个匹配的占位符位置,才会出现start参数位置塞了整个列表、end参数位置填了start日期的问题。
修正代码
最稳妥的方式是使用urllib.parse自带的urlencode方法构造查询字符串,不需要手动拼接占位符,还能自动处理特殊字符转义,修正后代码如下:
from urllib.parse import urljoin, urlencode num_terms = int(input("Enter total number of search terms:")) # 若实际使用时搜索词用逗号分隔,把下面的split()改成split(",")即可,当前适配你测试用的空格分隔输入 a = input("Enter all search terms: ").split(maxsplit=num_terms) start, end = input("Enter start and end date").split() base_url = "http://mytest.org" # 构造多值查询参数 query_params = [("terms[]", term) for term in a] query_params.extend([("start", start), ("end", end)]) join_url = "/comments/data?" + urlencode(query_params) url = urljoin(base_url, join_url) print(url)
如果要手动拼接字符串,直接用f-string拼接列表元素即可,不需要做复杂的占位符乘法,示例写法:
join_url = "/comments/data?" + "&".join([f"terms[]={term}" for term in a]) + f"&start={start}&end={end}"
运行验证
按照你给出的测试输入:
- 搜索词数量输入3
- 搜索词输入
ty ou io - 日期输入
2345 7890
最终输出为:http://mytest.org/comments/data?terms[]=ty&terms[]=ou&terms[]=io&start=2345&end=7890
和预期结果完全一致。
内容的提问来源于stack exchange,提问作者biggboss2019
相关产品推荐
相关产品推荐

