Python字符串化字典列表内外引号互换 接口POST请求Body构造问题
问题原因及解决方案
1. replace不生效的根因
Python中字符串是不可变对象,str.replace()方法不会修改原字符串,只会返回替换后的新字符串。你在代码中仅执行了body.replace("'", '"'),没有将返回结果重新赋值给body变量,相当于替换操作的结果被直接丢弃,原字符串没有任何变化。你在Python Shell中测试时能看到正确结果,是因为Shell会自动打印方法的返回值,并不是原变量被修改了。
2. 字典列表转请求body的正确方式
你不需要用str()转换后手动替换引号,直接使用json.dumps()处理字典列表即可,它生成的标准JSON字符串天然符合「内部所有字符串用双引号」的要求,完全适配POST请求的body格式要求。如果确实需要在整个字符串外层包裹单引号,直接对json.dumps()的输出做拼接即可。
修正后的代码
import json def insert_header(self, request): pid = request.meta['pid'] pa = request.meta['pa'] url = request.url pid = [x.split('ern:product::')[-1] for x in pid] body = [ {"id":"1234567","variables":{"id":"ern:product::pid"}}, {"id":"1234567","variables":{"id":"ern:product::pid"}}, {"id":"1234567","variables":{"id":"ern:product::pid"}} ] if len(pid) == len(body): for counter, i in enumerate(body): i["variables"] = {"id":"ern:product::" + pid[counter]} # 直接生成标准JSON格式body,内部自动为双引号 body = json.dumps(body) # 如果确实需要外层加单引号,打开下面这行注释即可 # body = f"'{body}'" return Request(url, method='POST', meta=request.meta, body=body, callback=self.check_header, **self.parse_page_kwargs)
额外说明
如果你之前用json.dumps()没有得到预期结果,大概率是用法错误,没有把生成的结果赋值给body变量,和之前replace不生效的原因一致。
内容的提问来源于stack exchange,提问作者Brian
相关产品推荐
相关产品推荐

