赞
踩
调用某个接口的api,然后获取数据,分析用
data = json.loads(resp.text)
过程提示:
json.decoder.JSONDecodeError: Expecting property name enclosed in double quotes: line 1 column 40 (char 39)
一开始以为只是单引号的问题(json对符号严格,单引号会解析报错,双引号才可以),就直接
resp.text.replace("", '"')
# 将单引号替换为双引号
然后再 json.loads(resp.text),发现还是报错。
没办法只能猜测返回值里面含有一些奇奇怪怪的符号格式
通过对resp.text得知(当然也可以分析resp.content。text为str类型,content为bytes类型,也就是编码后的json格式),返回的接口字符并不符合json解析。
resp.text.replace("", '"')
# 将单引号替换为双引号
发现还是报错,分析报错日志,里面的报错部分内容如下:
{"success":true, "message":"","data":{total:222,root:[{'article_card__num':'3','asset_card__syn_date':(new Date(2023, 1, 7, 4, 1,26))}],all:[]}}
佛了,这陈年旧接口,又是双引号,又是单引号,又日期类型(关键是之前前端JS还能正常解析到)。
这里报错的核心是json解析不了字符串里面的
(new Date(2023, 1, 7, 4, 1,26)
那就想办法替换掉
resp.text.replace('(new Date(', '"').replace('))', '"')
通常我们会提取到需要的部分,然后为了避免单引号影响,所以
resp.text[54:-12].replace('(new Date(', '"').replace('))', '"').replace("'", '"')
当然这里如果resp.text[23:-12]不是一个固定的字符串,则考虑正则提取
import re
pattern_str = r'root:(.*),all'
pattern = re.compile(pattern_str)
result = re.search(pattern, res)
data = result.group(1) # 提取到对应正则中(.*)部分,也就是需要的值
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。