场景:
做爬虫时,遇到json格式的数据,找到对应的url后,json格式化的开头有以jQuery开头的一串字符串和括号不是json格式,解码时报错
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
问题描述
例如:以该网站为例,https://data.eastmoney.com/gzfx/detail/002594.html,对json进行解码时如下:
import requests
import json
url = 'https://datacenter-web.eastmoney.com/api/data/v1/get?callback=jQuery112305522640988534238_1680571452074&reportName=RPT_VALUEANALYSIS_DET&columns=ALL"eColumns=&pageNumber=1&pageSize=5000&sortColumns=TRADE_DATE&sortTypes=1&source=WEB&client=WEB&filter=(SECURITY_CODE=%22002594%22)&_=1680571452075'
headers={'referer':r'https://data.eastmoney.com/',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62'}
rsp = requests.get(url=url,headers=headers)
rsp_json = json.loads(rsp.text)
但是遇到报错:
json.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)
原因分析:
查看格式化json时发现多了下图框出来的一块内容,导致字典识别错误。
解决方案:
既然多了这一块内容使其构不成字典,那就将这一部分去掉,将字典部分拿出来解析,注意在最后面还有个括号和分号也要去掉:
提示:采用正则表达式
import requests
import json
import re
url = 'https://datacenter-web.eastmoney.com/api/data/v1/get?callback=jQuery112305522640988534238_1680571452074&reportName=RPT_VALUEANALYSIS_DET&columns=ALL"eColumns=&pageNumber=1&pageSize=5000&sortColumns=TRADE_DATE&sortTypes=1&source=WEB&client=WEB&filter=(SECURITY_CODE=%22002594%22)&_=1680571452075'
headers={'referer':r'https://data.eastmoney.com/',
'User-Agent':'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/111.0.0.0 Safari/537.36 Edg/111.0.1661.62'}
rsp = requests.get(url=url,headers=headers)
rsp_sub = re.sub('^jQuery112305522640988534238_1680571452074\(', '', rsp.text)
rsp_sub_2 = re.sub('\);', '', rsp_sub)
rsp_json = json.loads(rsp_sub_2)
print(rsp_json)
最后成功获取: