如何使用Python requests库提交同name不同类型的两个表单输入项
问题根因
你之前的提交方式存在两个问题:
- 该表单属于带文件上传的
multipart/form-data类型表单,你只传data参数时requests会默认使用application/x-www-form-urlencoded编码,和浏览器的请求编码不一致 - 你遗漏了name同为
image1的空文件字段,后端无法区分普通字段和文件字段,就把你传入的data/file.jpg路径当成了新上传的文件内容处理。
解决方法
requests支持同时传入data参数存放普通表单字段、files参数存放文件字段,同名字段不会互相覆盖,会按规则拼入最终的multipart请求体中,和浏览器的提交结构完全对齐。
修改后的代码如下:
data = {} files = {} form = get_all_forms(url)[1] #函数返回通过requests.get()获取的表单列表,此处选中目标表单 formDetails = get_form_details(form) #使用BeautifulSoup提取所有input的值 for inputTag in formDetails["inputs"]: if inputTag["type"] == "file": # 三元组格式对应:(文件名, 文件二进制内容, Content-Type),和浏览器提交的空文件结构完全匹配 files[inputTag["name"]] = ("", b"", "application/octet-stream") else: data[inputTag["name"]] = inputTag["value"] #设置为当前值 # 同时传入data和files参数,requests会自动使用multipart/form-data编码提交 res = requests.post(url, data=data, files=files)
如果不需要上传新文件,保持上面的空文件配置即可,后端会识别到没有新文件上传,保留你传入的原有路径data/file.jpg对应的图片。
内容的提问来源于stack exchange,提问作者Corsaka
相关产品推荐
相关产品推荐

