python jsonpath 解析问题


jQuery112307997584997957201_1684933524717({
    "version": "885c6d33cf9ec1dda48bc709b0513859",
    "result": {
        "pages": 1,
        "data": [{
            "S_CODE": "代码1",
            "S_NAME": "名称1"
        },{
            "S_CODE": "代码2",
            "S_NAME": "名称2"
        }],
        "count": 32
    },
    "success": true,
    "message": "ok",
    "code": 0
});

我用python requests 采集网页数据,返回就是上述的代码

response = requests.get(url)

try:
    resultdata = response.content.decode('utf-8')
    
    jsDumps = json.dumps(resultdata)
    
    rd = json.loads(jsDumps) 
    print(rd)

    d1 = jsonpath.jsonpath(rd,"$..S_CODE")
    
    print(d1)     #这句总是打印False
    
except Exception as e1:
    print(e1)

我想取得多个S_CODE和S_NAME值,但总是打印False, 我对py和jsonPath都不熟悉,麻烦各位帮我看看,谢谢啊!

json_data = response.content.decode('utf-8')

# 从字符串中删除'jQuery...'前面的内容以及末尾的分号 ';'
json_data = json_data.replace('jQuery112307997584997957201_1684933524717(', '')
json_data = json_data[:-2]

# 解析json数据
data = json.loads(json_data)

# 通过jsonpath提取所有"S_CODE"的值
s_codes = jsonpath.jsonpath(data, '$..S_CODE')

该回答引用ChatGPT4与博主@晓码自在合作编写:

根据你提供的代码和错误信息,出现问题的原因很可能是:

  1. 返回的数据resultdata不是一个标准的JSON字符串,所以无法使用JSON.loads()解析。
  2. 使用jsonpath提取数据时,传入的不是一个JSON对象,导致无法查找并打印False。

解决方法:

  1. 首先需要使用正则表达式或其他方法确保resultdata是标准JSON格式的字符串,如果不是需要进行修复后再解析。

  2. JSON字符串解析后得到的是一个JSON对象(Dictionary),需要传入这个对象给jsonpath,而不是原始字符串。

修复后的代码如下:

python
import requests 
import json
import jsonpath
import re

response = requests.get(url)
resultdata = response.content.decode('utf-8')

# 修复resultdata为JSON格式字符串 
resultdata = re.sub(r'^jQuery\d+\((.*)\)$', r'\1', resultdata)

# JSON字符串解析为Python对象 
rd = json.loads(resultdata)  

# 传入JSON对象给jsonpath
d1 = jsonpath.jsonpath(rd,"$..S_CODE")  
print(d1)   

首先使用正则表达式去掉开头的jQuery...,修复为JSON字符串。然后使用JSON.loads()解析为Python对象,这个对象才是jsonpath所需要的输入。

传入修复后的JSON对象rd给jsonpath后,就可以正确获取S_CODE的值并打印出来。

JSON和jsonpath都是比较常用的工具,了解数据格式与解析对象的对应关系,对调用各种API和处理响应数据很重要。