一、问题描述
在使用爬虫爬取数据时使用json.loads()解码JSON数据时遇到如下错误:
1 致错语句:
json_data = json.loads(str(star_infos).replace("\'","\""))
2 错误
---------------------------------------------------------------------------JSONDecodeError Traceback (most recent call last)<ipython-input-9-294f59eab595> in <module>
9 #从每个选手的百度百科页面上爬取,并保存
---> 10 crawl_everyone_wiki_urls()
11 print("所有信息爬取完成!")
<ipython-input-6-2fe5f3e0c9f9> in crawl_everyone_wiki_urls()
59 down_save_pic(name,pic_urls)
60 #将个人信息存储到json文件中
---> 61 json_data = json.loads(str(star_infos).replace("\'","\""))
62 with open('work/' + 'stars_info.json', 'w', encoding='UTF-8') as f:
63 json.dump(json_data, f, ensure_ascii=False)
...
...
/opt/conda/envs/python35-paddle120-env/lib/python3.7/json/decoder.py in raw_decode(self, s, idx)
351 """
352 try:
--> 353 obj, end = self.scan_once(s, idx)
354 except StopIteration as err:
355 raise JSONDecodeError("Expecting value", s, err.value) from None
JSONDecodeError: Invalid \escape: line 1 column 2687 (char 2686)
二 错误分析
该异常的格式一般为:
json.decoder.JSONDecodeError: Invalid \escape: line 1 column 1 (char 1)
注意后面的数字 line 123456789(数字可以为任意值), column 123456789(数字可以为任意值),char 123456789 (数字可以为任意值)
异常的中文释义:
JSONDecodeError(JSON 解码错误)Invalid \escape:无效字符反斜线 ,也就是说你的待格式字符串中包含一个
该异常一般出现在 JSON 格式化的情况下,如果 JSON 中出现特殊字符易出现该 BUG。
参考链接: https://blog.csdn.net/hihell/article/details/109526943
三 解决方式
原本的解码语句:(要解码的python对象为 “star_infos” )
json_data = json.loads(str(star_infos).replace("\'","\""))
由于问题是字符格式导致的,因此先使用json.dumps()将python对象编码成JSON字符串(自认为就是对python对象进行规范,使其符合JSO的解码格式)
string = json.dumps(star_infos)
然后再进行解码(此时python对象变为"string")
json_data = json.loads(str(string).replace("\'", "\""))