python爬取网页json数据出错,无法获取目标结果,我想获取list中结果,
js['result']['list']结果报错:
print(js['result']['list'])
TypeError: string indices must be integers
js['result']结果并不是想要的内容:
我的代码是:
person = requests.post(bcf_url, json=bcf_data,cookies=global_value.cookies_sz, headers=global_value.header)
print(person.status_code)
js = person.json()
print(js['result'])
最简单的办法
import json
data = responde.text
js_data = json.loads(data)
list_data = js['result']['list']
# 后面for循环就行了或者直接简写
result_list_data = [ i[列表中字段的key] for i in list_data ]
打印person.text,没问题就改
import json
js=json.loads(person.text)
你可以试一下把req.text换成req.json()
调试一下,判断一下类型是否正确以及对字符串的校验,有时候可能出现未知错误导致返回内容不同,导致格式不匹配
首先要确定你post 返回的结果是啥,如果内容确实是你要的内容字符串,那就是程序解析问题,如果内容是异常信息,那就可能是你抓取方式问题,可能是服务器限制直接请求,可以分析下浏览器的请求头信息模拟下再请求
print(js['result']['list'][0]) #试试这个能出结果吗?
说明你没有爬取到数据(状态 200 不代表获取到数据),result 的数据是错误的内容,所以报字符串索引错误
从你页面的截图来看 响应的网页 json 数据是固定且有规律可循的。既然是有规律的,是否可以尝试通过模糊查询的正则匹配来获取你想要的数据呢?
这不是解析报错,而是调用后服务端异常了,服务端异常后返回了状态码200,返回的result就是java.lang.RuntimeException…这一串
你可以先确认是不是服务端报错,如果是,服务端给你返回的内容是什么?
print(person.text)
先打印一下内容。
一般服务端报错会有返回信息的。如果返回的数据你没办法解析,那么你需要处理一下。不影响其他的请求。
还有就是确认一下请求的时候,是不是需要在header中增加属性。
昨天也遇到了这个问题,有可能是json格式不标准,json应该是键值对吧?里面有些键是字符串,但没有双引号,当时我在网上也找了一堆,没找到相应的解决方法,看你这些一系列数据都有很大的相似性,建议用正则表达式解决。
r=requests.post(url,data=postData)
r.encoding=r.apparent_encoding
#print(r.text)
html=r.text
jsondata = re.search(r'\(([\s\S]*?)$',html).group(1)[:-1]
#print(jsondata)
s=json.loads(jsondata)
comList=s['data']['CorpInfoList']
i=1
for com in comList:
line=''
for key,value in com.items():
line+=value+'\t'
wf.write(line+'\n')
wf.flush()
sting类型的数据的索引必须是int类型的
最好在你的代码上加个try catch ,你爬下来的数据有可能在你请求的时候拿不到,你要判断处理一下
TypeError: string indices must be integers
意思是索引必须是int型。
错误原因(出这种错误有多种可能,查找了一类错误)
经查找发现,是json格式导致的错误,info的value是json数据,python无法直接识别。
解决办法 原来字典存储的对象是json,因此需要把json反解码后才可以读取。
要json.loads(),才能把json格式转为python识别的格式。
加上一行代码:
ExtendValue["info"]=json.loads(ExtendValue["info"])
具体的可以看看这位博主所写内容:https://blog.csdn.net/outman_1921/article/details/109560307
希望对题主有所帮助!
你是不是有很多个url,有些url没有请求到数据,加个判断语句解决异常
TypeError: string indices must be integers
说明 js是个str, 把js转换成json 试试
js=json.loads(js)
print(js['result']['list'])
再不行, 打印下 js 看看
正则表达式re.findAll() 可以解析成功