最近上面安排了一个任务, 叫我去爬些数据, 然后我就遇到了这么一个问题, 对方网站接口返回的数据格式不是一个json, 而是一串不规则(类似json)的字符串, 哦买嘎, 这可咋整, 在线等, 急.....
别怕,弟弟来告诉你
1: 首先来看看接口返回的到底是什么?
paramStr = jsonpCallback({statue:1,message:"查询成功",totalCount:1,data:[{"agreementName":"免关税待遇措施","agreementCode":"13","impAgreementRate":"0"}]});
它返回的是一串看似规范又不太规范的字符串, 而我期望得到的数据为
{"data":[{"agreementCode":"13","agreementName":"免关税待遇措施","impAgreementRate":"0"}],"message":"查询成功","statue":1,"totalCount":1}
2: 解决思路
2.1: 首先从这串字符串paramStr 中提取出我们需要的数据
2.2: 再把提取之后的数据转为json字符串即可
3: 实操
3.1: 提取数据
paramStr = 'jsonpCallback({statue:1,message:"查询成功",totalCount:1,data:[{"agreementName":"免关税待遇措施","agreementCode":"13","impAgreementRate":"0"}]});'
paramStr = paramStr.replace('jsonpCallback','').replace('(','').replace(')','').replace(';','')
print('替换字符串后的paramStr为', paramStr)
#{statue:1,message:"查询成功",totalCount:1,data:[{"agreementName":"免关税待遇措施","agreementCode":"13","impAgreementRate":"0"}]}
3.2: 把
{statue:1,message:"查询成功",totalCount:1,data:[{"agreementName":"免关税待遇措施","agreementCode":"13","impAgreementRate":"0"}]}
转为json字符串
{"data":[{"agreementCode":"13","agreementName":"免关税待遇措施","impAgreementRate":"0"}],"message":"查询成功","statue":1,"totalCount":1}
这里我们需要用到第三方库 demjson
3.2.1 首先 导入 demjson (pip install demjson)
import demjson
3.2.2 将这段看似规范的字符串转成对象 (需要注意的是, 字符串的大体需要跟json类似, 需包括key:value的形式, 且用逗号分隔, 不一样的地方就是它的key可以不需要使用引号""括起来)
print(demjson.decode(paramStr))#将伪json转成对象 {'statue': 1, 'message': '查询成功', 'totalCount': 1, 'data': [{'agreementName': '免关税待遇措施', 'agreementCode': '13', 'impAgreementRate': '0'}]}
print(type(demjson.decode(paramStr)))#demjson后对应类型--> <class 'dict'>
此时我们发现输出的数据不是使用双引号括起来的
3.2.3: 把对象转换为json字符串
print(demjson.encode(demjson.decode(paramStr)))#将对象转换为json字符串 {"data":[{"agreementCode":"13","agreementName":"\u514d\u5173\u7a0e\u5f85\u9047\u63aa\u65bd","impAgreementRate":"0"}],"message":"\u67e5\u8be2\u6210\u529f","statue":1,"totalCount":1}
print(type(demjson.encode(demjson.decode(paramStr))))#encode后对应类型 <class 'str'>
这里发现输出的json数据的中文被转码了(如果您的数据没有中文或不需要用到中文,那么就到此为止啦)
3.2.4: 把被转码的内容转为中文
print(demjson.encode(demjson.decode(paramStr)).encode('utf-8').decode('unicode_escape'))
#{"data":[{"agreementCode":"13","agreementName":"免关税待遇措施","impAgreementRate":"0"}],"message":"查询成功","statue":1,"totalCount":1}
4: 一键三连 (关注, 点赞, 收藏)