账号密码登录
微信安全登录
微信扫描二维码登录

登录后绑定QQ、微信即可实现信息互通

手机验证码登录
找回密码返回
邮箱找回 手机找回
注册账号返回
其他登录方式
分享
  • 收藏
    X
    Python3 爬取信息中josn.loads解码报错
    51
    0
    背景介绍:爬取网站疫情信息本身符合json格式,直接json.loads报错。1. 报错代码Traceback (most recent call last): File "D:\Users\shishengchen\PycharmProjects\pythonProject\COVID-19-Data\Test1.py", line 38, in <module> getTheList("https://ncov.dxy.cn/ncovh5/view/pneumonia") File "D:\Users\shishengchen\PycharmProjects\pythonProject\COVID-19-Data\Test1.py", line 26, in getTheList worldDataJson=json.loads(worldDatastr) File "D:\Users\shishengchen\AppData\Local\Programs\Python\Python310\lib\json\__init__.py", line 346, in loads return _default_decoder.decode(s) File "D:\Users\shishengchen\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 337, in decode obj, end = self.raw_decode(s, idx=_w(s, 0).end()) File "D:\Users\shishengchen\AppData\Local\Programs\Python\Python310\lib\json\decoder.py", line 355, in raw_decode raise JSONDecodeError("Expecting value", s, err.value) from Nonejson.decoder.JSONDecodeError: Expecting value: line 1 column 1 (char 0)2. Python代码import requestsimport reimport jsonfrom bs4 import BeautifulSoupdef getOriHtmlText(url,code='utf-8'): try: headers = { 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/87.0.4280.66 Safari/537.36' } r=requests.get(url,timeout=30,headers=headers) r.raise_for_status() r.encoding=code return r.text except: return "There are some errors when get the original html!"def getTheList(url): html=getOriHtmlText(url) soup=BeautifulSoup(html,'html.parser') htmlBodyText=soup.body.text print(soup.body) # 获取国家数据 worldDataText=htmlBodyText[htmlBodyText.find('window.getListByCountryTypeService2true = '):] worldDatastr = worldDataText[worldDataText.find('[{'):worldDataText.find('}catch')] worldDataJson=json.loads(worldDatastr) with open("D:/Users/shishengchen/PycharmProjects/pythonProject/COVID-19-Data/data/worldData.json","w") as f: json.dump(worldDataJson,f) print("写入国家数据文件成功!") # 获取各省份数据 provinceDataText = htmlBodyText[htmlBodyText.find('window.fetchRecentStatV2 = '):] provinceDatastr = provinceDataText[provinceDataText.find('[{'):provinceDataText.find('}catch')] provinceDataJson=json.loads(provinceDatastr) with open("D:/Users/shishengchen/PycharmProjects/pythonProject/COVID-19-Data/data/provinceData.json", "w") as f: json.dump(provinceDataJson,f) print("写入省份数据文件成功!")getTheList("https://ncov.dxy.cn/ncovh5/view/pneumonia")
    0
    打赏
    收藏
    点击回答
        全部回答
    • 0
    • ( ̄oo ̄)潴潴 普通会员 1楼

      在Python3中,使用josn.loads函数解析JSON数据并获取其解码后的值时,可能会出现以下错误:

      错误消息: ValueError: json.decoder.JSONDecodeError: Unterminated quoted string

      这通常发生在以下几种情况下:

      1. JSON数据格式错误:JSON数据的开始和结束引号("或":")不匹配。例如,如果你的JSON字符串格式为:

      json { "name": "John", "age": 30, "city": "New York" }

      则在解析时,可能会遇到错误:

      ```python import json

      json_data = '{"name": "John", "age": 30, "city": "New York"}' decoded_data = json.loads(json_data) ```

      这时,如果在字符串末尾添加了一个双引号(")或在字符串开始添加了一个单引号("):

      python json_data = '{"name": "John", "age": 30, "city": "New York"}' decoded_data = json.loads(json_data, allow_unicode=True)

      上述解析将会导致错误,因为JSON解码器试图解析一个未结束的双引号("或":")的字符串,这与预期的JSON数据格式不匹配。

      解决方法:

      1. 检查JSON数据格式:
      2. 首先,确保JSON字符串的开始和结束引号("或":")是正确的。例如,正确的JSON数据格式应该是:

      json { "name": "John", "age": 30, "city": "New York" }

      1. 如果JSON数据的开始和结束引号("或":")是正确的,尝试将字符串转换为Python字典或元组:
      2. 如果JSON数据本身包含字典,可以将字符串转换为Python字典:

      python json_data = '{"name": "John", "age": 30, "city": "New York"}' decoded_data = json.loads(json_data, parse_dates=True)

      或者,如果JSON数据本身就是字典,可以将其解析为Python字典:

      python json_data = '{"name": "John", "age": 30, "city": "New York"}' decoded_data = json.loads(json_data, object_hook=lambda d: d)

      1. 如果JSON数据的开始和结束引号("或":")是正确的,并且JSON数据本身就是字典或元组,但是JSON解码器不能正确解析它,可以尝试使用json.loads()函数的allow_unicode=True参数,以允许Python字典中的非ASCII字符进行解码:

      python json_data = '{"name": "John", "age": 30, "city": "New York"}' decoded_data = json.loads(json_data, allow_unicode=True)

      这将尝试解析JSON数据中的非ASCII字符,即使它们不在正常JSON字符集范围内。请注意,如果JSON数据的开始和结束引号("或":")不匹配,上述方法将不会解决问题。

      1. 检查编码:
      2. 如果JSON数据是通过URL或URLSearchParams等请求获取的,检查编码是否正确。在Python中,你可以使用urllib.parse.parse_qs()函数解析URL查询字符串,其中查询字符串中的每个参数是一个字典,键是参数名,值是参数值。检查查询字符串的编码是否与Python字符串编码一致。

      python url_data = "https://jsonplaceholder.typicode.com/todos/1" parsed_query = urllib.parse.parse_qs(url_data, keep_blank_values=True) decoded_query = parsed_query["query"][0]["value"]

      如果查询字符串的编码与Python字符串编码不一致,上述方法将不会解决问题。

      1. 处理未结束的双引号:
      2. 如果JSON数据的开始和结束引号("或":")不是正确的,可以使用Python的字符串操作函数(如replace()replace_all())将引号替换为字符串,以正确解析JSON数据。例如:

      python json_data = '{"name": "John", "age": 30, "city": "New York"}' decoded_data = json.loads(json_data, parse_dates=True) decoded_data["name"] = decoded_data["name"].replace('"', "'")

      在上述代码中,我们将字符串中的双引号替换为单引号,以正确处理JSON数据中的双引号。

      以上是修复JSON解析错误的一些常见方法,具体取决于你的具体需求和代码实现方式。如果你无法确定具体原因或代码中出现的错误,请提供更多信息,以便我能提供更准确的建议。

    更多回答
    扫一扫访问手机版
    • 回到顶部
    • 回到顶部