Python json 数据提取 jsonpath 详解

一、JsonPath

     JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。也就是独立的可以配合多种语言进行匹配的目标值的一种类库,和jmeter中的jsonPath匹配方式很像(具体参考此文章:https://www.cnblogs.com/Zhan-W/p/10985816.html )。优点之一: 数据可以通过交互方式从客户端上的JSON结构提取,不需要特殊的脚本

二、JsonPath特性

  1. 只能提取json格式的数据
  2. 提取后的数据类型与原数据类型一致

三、 JsonPath安装

pip install jsonpath -i https://pypi.doubanio.com/simple

 四、 JsonPath 语法元素

  官方文档:JSONPath - XPath for JSON

Python json 数据提取 jsonpath 详解_第1张图片

过滤表达式 

Python json 数据提取 jsonpath 详解_第2张图片

  五、 JsonPath 使用

import requests
import json
import jsonpath


if __name__ == '__main__':
    # 1.确认目标url
    url_ = 'https://www.lagou.com/lbs/getAllCitySearchLabels.json'

    # 用户代理的代理
    headers_ = {
        'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
    }

    # 2.发送网络请求,获取响应对象
    response_ = requests.get(url_, headers=headers_)

    #获取python格式,自动类型转换
    py_data=response_.json() # json()这是一个方法
    print(type(py_data),py_data)

    # $:根元素
    #(1)获取所有城市名称
    names=jsonpath.jsonpath(py_data,'$..name')
    print(len(names),names)

    # .or []:子元素
    #(2)获取所有城市中按字母分类的第一个城市的所有信息
    res=jsonpath.jsonpath(py_data,"$..allCitySearchLabels.*[:1]")
    print(len(res),res)

    # [, ]:支持迭代器中做多选,多个key用逗号隔开
    #(3)获取A字母的城市名和父城市id
    res=jsonpath.jsonpath(py_data,"$..A.[name,parentId]")
    print(len(res),res)

    #(4)获取B字母的城市下的第0个和第16个城市信息
    res=jsonpath.jsonpath(py_data,"$..B[0,16]")
    print(len(res),res)

    # [start:end:step]:数组分割操作,等同于切片, 遵循左闭右开原则
    #(5)获取B字母的城市下的前2个城市信息
    res=jsonpath.jsonpath(py_data,"$..B[:2]")
    print(len(res),res)


    # ?():应用过滤表示式
    #(6)获取B字母的城市下的id编号大于850的信息
    res=jsonpath.jsonpath(py_data,"$..B.[?(@.id>850)]")
    print(len(res),res)

    # == :等于
    # (7)查询城市是福州的城市信息
    res = jsonpath.jsonpath(py_data, "$..*[?(@.name=='福州')]")
    print(len(res), res)

    # in :所属符号
    # (8)查询城市是杭州,北京,天津的城市信息
    res = jsonpath.jsonpath(py_data, "$..*[?(@.name in ['杭州','北京','天津'])]")
    print(len(res), res)

    # (8)查询城市是杭州,北京,天津的code信息
    res = jsonpath.jsonpath(py_data, "$..*[?(@.name in ['杭州','北京','天津'])].code")
    print(len(res), res)

    # not in :排除符号
    # (9)查询城市不是杭州,北京,天津的城市信息
    res = jsonpath.jsonpath(py_data, "$..*[?(@.name not in ['杭州','北京','天津'])]")
    print(len(res), res)


   # &&:逻辑AND,用于合并多个过滤器表达式
   #  (10)查询城市是杭州,并且ID是653的城市信息
    res = jsonpath.jsonpath(py_data, "$..*[?(@.name =='杭州' && @.id==653)]")
    print(len(res), res)


    # || 逻辑OR,用于组合多个过滤器表达式
    # (11)查询城市是杭州, 或者ID大于1000的城市信息
    res = jsonpath.jsonpath(py_data, "$..*[?(@.name =='杭州' || @.id>1000)]")
    print(len(res), res)


Python json 数据提取 jsonpath 详解_第3张图片

 

你可能感兴趣的:(python)