鱼C论坛

 找回密码
 立即注册
查看: 1343|回复: 17

[已解决]求助关于json.loads()报错

[复制链接]
发表于 2020-3-17 17:54:09 | 显示全部楼层 |阅读模式

马上注册,结交更多好友,享用更多功能^_^

您需要 登录 才可以下载或查看,没有账号?立即注册

x
本帖最后由 光头大帅比 于 2020-3-17 21:06 编辑


这是我看完小甲鱼爬取网易云评论后效仿爬取京东评论的代码,json文件能够正常获取,但是在使用json.loads()时报错,望各位大佬指出是哪里错了


源代码文本形式如下:

import requests
import json
headers = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
           'refer':'https://item.jd.com/100008348542.html'
    }
url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100008348542&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
res = requests.get(url,headers = headers)
print(res.text)
data = json.loads(res.text)
print(data)

由于京东平台评论数据与网易云评论的数据的差异,上述代码获取到的res.text中的数据并不是标准的json格式(简单来说json格式可以理解为python的字典数据用引号括起来形成的字符串),并不能直接利用json.loads()进行转换,需要对该数据进行清洗,将最前面的   “fetchJSON_comment98(”     以及最后面的  “)”  去掉才是标准的json格式,以下是我在大佬指点下修改的代码:

import requests
import json
headers = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
           'refer':'https://item.jd.com/100008348542.html'
    }
url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100008348542&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
res = requests.get(url,headers = headers)
s1 = res.text.split('fetchJSON_comment98(')[1]
finalres = s1[:-2]
print('此时的数据类型是:')
print(type(finalres))
print('现在进行json.loads()转换')
data = json.loads(finalres)
print('转换完了,此时数据类型是:')
print(type(data))

从结果可以看出,成功进行了数据转换获得了字典类型
U6M6LPMSMQ8HF00~]H(11[Q.png
最佳答案
2020-3-17 19:18:29
光头大帅比 发表于 2020-3-17 19:15
我记得是loads把json字符串转换成字典,dumps把字典转换成json字符串呀


是能转换成字典,但是要的是未转换就是个字典的参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复

使用道具 举报

发表于 2020-3-17 17:55:17 | 显示全部楼层
把s去掉?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 18:02:05 | 显示全部楼层


报了另一个错。。。 PNBH_PV[9%{`%)0J_A5A0.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 18:08:21 | 显示全部楼层
光头大帅比 发表于 2020-3-17 18:02
报了另一个错。。。

你把源代码以文本形式发出来
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 18:35:42 | 显示全部楼层
光头大帅比 发表于 2020-3-17 18:02
报了另一个错。。。

把 data = json.load() 改为 data = res.json()
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 18:46:27 | 显示全部楼层
qiuyouzhi 发表于 2020-3-17 18:08
你把源代码以文本形式发出来

import requests
import json
headers = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
           'refer':'https://item.jd.com/100008348542.html'
    }
url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100008348542&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
res = requests.get(url,headers = headers)
print(res.text)
data = json.load(res.text)
print(data)
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 18:48:21 | 显示全部楼层
光头大帅比 发表于 2020-3-17 18:46
import requests
import json
headers = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) Ap ...

你最后两步是要干嘛?
data不应该是一个字典吗?
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 18:56:14 | 显示全部楼层
qiuyouzhi 发表于 2020-3-17 18:48
你最后两步是要干嘛?
data不应该是一个字典吗?

就是获取了json后想把json文件通过json.loads转换成字典形式赋值给data呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 19:06:07 | 显示全部楼层
光头大帅比 发表于 2020-3-17 18:56
就是获取了json后想把json文件通过json.loads转换成字典形式赋值给data呀

要的是字典,不是结果是字典
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 19:15:46 | 显示全部楼层
qiuyouzhi 发表于 2020-3-17 19:06
要的是字典,不是结果是字典

我记得是loads把json字符串转换成字典,dumps把字典转换成json字符串呀
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 19:18:29 | 显示全部楼层    本楼为最佳答案   
光头大帅比 发表于 2020-3-17 19:15
我记得是loads把json字符串转换成字典,dumps把字典转换成json字符串呀


是能转换成字典,但是要的是未转换就是个字典的参数
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 19:19:27 | 显示全部楼层
一个账号 发表于 2020-3-17 18:35
把 data = json.load() 改为 data = res.json()

不是json.loads()然后括号里输入json格式的字符串吗
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 19:23:21 | 显示全部楼层
光头大帅比 发表于 2020-3-17 19:19
不是json.loads()然后括号里输入json格式的字符串吗

用 requests 自带的就行了
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 19:25:22 | 显示全部楼层
qiuyouzhi 发表于 2020-3-17 19:18
是能转换成字典,但是要的是未转换就是个字典的参数

我明白了,我看了一眼前面print出来的json字符串,里面还有一段不是键值对形式的东西,应该是这个东西导致的 (EXY92SGU~)XG1W6}OHY5NM.png
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 20:41:46 | 显示全部楼层
qiuyouzhi 发表于 2020-3-17 19:18
是能转换成字典,但是要的是未转换就是个字典的参数

成了,我改了一下代码,把里面包含的json格式清洗出来了,感谢大佬不吝赐教,下面是我更改后的代码:

import requests
import json
headers = {'user-agent':'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/80.0.3987.132 Safari/537.36',
           'refer':'https://item.jd.com/100008348542.html'
    }
url = 'https://club.jd.com/comment/productPageComments.action?callback=fetchJSON_comment98&productId=100008348542&score=0&sortType=5&page=0&pageSize=10&isShadowSku=0&fold=1'
res = requests.get(url,headers = headers)
s1 = res.text.split('fetchJSON_comment98(')[1]
finalres = s1[:-2]
print('此时的数据类型是:')
print(type(finalres))
print('现在进行json.loads()转换')
data = json.loads(finalres)
print('转换完了,此时数据类型是:')
print(type(data))


运行结果如图,成功实现了转换
U6M6LPMSMQ8HF00~]H(11[Q.png

再次感谢大佬
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 20:45:22 | 显示全部楼层
光头大帅比 发表于 2020-3-17 20:41
成了,我改了一下代码,把里面包含的json格式清洗出来了,感谢大佬不吝赐教,下面是我更改后的代码:

...


那就设个最佳答案,把帖子结了吧~
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

 楼主| 发表于 2020-3-17 20:55:41 | 显示全部楼层
qiuyouzhi 发表于 2020-3-17 20:45
那就设个最佳答案,把帖子结了吧~

嗯 谢谢大佬  我顺便把方法放到第一楼去方便别人参考
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

发表于 2020-3-17 21:01:27 | 显示全部楼层
光头大帅比 发表于 2020-3-17 20:55
嗯 谢谢大佬  我顺便把方法放到第一楼去方便别人参考

嗯嗯
想知道小甲鱼最近在做啥?请访问 -> ilovefishc.com
回复 支持 反对

使用道具 举报

您需要登录后才可以回帖 登录 | 立即注册

本版积分规则

小黑屋|手机版|Archiver|鱼C工作室 ( 粤ICP备18085999号-1 | 粤公网安备 44051102000585号)

GMT+8, 2024-11-25 00:54

Powered by Discuz! X3.4

© 2001-2023 Discuz! Team.

快速回复 返回顶部 返回列表