当你学会这项python数据提取神器时,请做好升职准备!

news2024/12/23 6:38:23

一、什么是 jsonpath


● JsonPath 是一种信息抽取类库,是从 JSON 文档中抽取指定信息的工具,提供多种语言实现版本,包括:JavaScript、Python、PHP 和 Java。

*文末领10节自动化精品课*

二、特点

● 只能提取 JSON 格式的数据

● 提取后的数据类型与原数据类型一致

三、安装

pip install jsonpath

四、常用原字符

原字符

描述

$

表示根元素

@

当前元素

. or []

子元素

..

递归搜索(不管当前路径,搜索符合条件的数据)

*

通配符,表示所有的元素

[]

子元素操作符

[,]

支持迭代器中做多选,多个 key 用逗号隔开

[start:end:step]

数组分割操作,等同于切片

?()

应用过滤表示式

五、常用元字符使用

● 测试数据

class_info = {"class_one": {
    "students": [
        {"name": "张一",
         "sex": "男",
         "age": 18,
         "height": 170.5
         },
        {"name": "张二",
         "sex": "女",
         "age": 20,
         "height": 160.5
         },
        {"name": "张三",
         "sex": "男",
         "age": 18,
         "height": 170.5
         },
    ],
    "teacher": {
        "name": "李小二",
        "sex": "男",
        "age": 30,
        "height": 185.5,
        "teacher":"递归搜索测试"
    }
}
}

● $:根元素

import jsonpath
#获取根元素下所有数据,2种写法一样
#.的作用等同于[]表示子元素
result = jsonpath.jsonpath(class_info, '$.*')
result2 = jsonpath.jsonpath(class_info, '$[*]')
print(result)
print(result2)
输出:
[{'students': [{'name': '张一', 'sex': '男', 'age': 18, 'height': 170.5}, {'name': '张二', 'sex': '女', 'age': 20, 'height': 160.5}, {'name': '张三', 'sex': '男', 'age': 18, 'height': 170.5}], 'teacher': {'sex': '男', 'age': 30, 'height': 185.5, 'teacher': '递归搜索测试'}}]


● . or []:子元素

import jsonpath
#.与[]作用相同后续就只写一个了
result = jsonpath.jsonpath(class_info, '$.class_one.students')
print(result)


result = jsonpath.jsonpath(class_info, '$[class_one][students]')
print(result)
输出:
[[{'name': '张一', 'sex': '男', 'age': 18, 'height': 170.5}, {'name': '张二', 'sex': '女', 'age': 20, 'height': 160.5}, {'name': '张三', 'sex': '男', 'age': 18, 'height': 170.5}]]


● [,]:支持迭代器中做多选,多个 key 用逗号隔开

import jsonpath
#递归查找包含teacher 或者 name的值
# ..:表示递归查找,可以搜索到该json下所有符合条件的数据
result = jsonpath.jsonpath(class_info, '$..[teacher,name]')
print(result)
输出:
[{'sex': '男', 'age': 30, 'height': 185.5, 'teacher': '递归搜索测试'}, '张一', '张二', '张三', '递归搜索测试']


#获取students下第0个和第2个元素
re = "$..students[0,2]"
result = jsonpath.jsonpath(class_info,re)
print(result)
输出:
[{'name': '张一', 'sex': '男', 'age': 18, 'height': 170.5}, {'name': '张三', 'sex': '男', 'age': 18, 'height': 170.5}]


● [start:end:step]:数组分割操作,等同于切片 , 遵循左闭右开原则

import jsonpath
#获取前2位学生的信息,支持下标运算,类似list通过下标取值一样
result = jsonpath.jsonpath(class_info, '$.class_one.students[0:2]')
print(result)
输出:
[{'name': '张一', 'sex': '男', 'age': 18, 'height': 170.5}, {'name': '张二', 'sex': '女', 'age': 20, 'height': 160.5}]


● ?():应用过滤表示式

import jsonpath
#找出年龄大于18的学生
result = jsonpath.jsonpath(class_info, '$.class_one.students.[?(@.age>18)]')
print(result)
输出:[{'name': '张二', 'sex': '女', 'age': 20, 'height': 160.5}]

六、过滤表达式

原字符

描述

==

等于符号,但数字 1 不等于字符 1

!=

不等于符号

<

小于符号

<=

小于等于符号

>

大于

>=

大于等于符号

=~

判断是否符合正则表达式,例如[?(@.name =~ /foo.*?/i)]

in

所属符号:[?(@.name in['张二','张三'])]

not in

排除符号:[?(@.name not in ['张二','张三'])]

&&

逻辑 AND,用于合并多个过滤器表达式

II

逻辑 OR,用于组合多个过滤器表达式

七、过滤表达式使用

● ==:等于

import jsonpath
#下面几个比较的和这个一样就不写了
#找出name==张三的学生
result = "$.class_one.students.[?(@.name=='张三')]"
print(result)
输出:[{'name': '张三', 'sex': '男', 'age': 18, 'height': 170.5}]


● in:所属符号

import jsonpath
#获取name等于张二或者张三
re = "$.class_one.students.[?(@.name in ['张二','张三'])]"
result = jsonpath.jsonpath(class_info,re)
print(result)
输出:
[{'name': '张二', 'sex': '女', 'age': 20, 'height': 160.5}, {'name': '张三', 'sex': '男', 'age': 18, 'height': 170.5}]


#找出name为张二,张三的学生年龄
re = "$.class_one.students.[?(@.name in ['张二','张三'])].age"
result = jsonpath.jsonpath(class_info,re)
print(result)
输出:[20, 18]


● &&:逻辑 AND,用于合并多个过滤器表达式

import jsonpath
re = "$..students[?(@.name=='张三' && @.age==18)]"
result = jsonpath.jsonpath(class_info,re)
print(result)
输出:[{'name': '张三', 'sex': '男', 'age': 18, 'height': 170.5}]


● || 逻辑 OR,用于组合多个过滤器表达式

import jsonpath
#获取name等于张三或者age等于18的学生
re = "$..students[?(@.name=='张三' || @.age==18)]"
result = jsonpath.jsonpath(class_info,re)
print(result)
输出:[{'name': '张一', 'sex': '男', 'age': 18, 'height': 170.5}, {'name': '张三', 'sex': '男', 'age': 18, 'height': 170.5}]


● not in :排除符号

import jsonpath
#name不等于'张一','张三'的学生
re = "$..students[?(@.name not in ['张一','张三'])]"
result = jsonpath.jsonpath(class_info,re)
print(result)
输出:
[{'name': '张二', 'sex': '女', 'age': 20, 'height': 160.5}]

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/555923.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

Postman和Jmeter的区别

01、创建接口用例集 Postman 是 Collections&#xff0c;Jmeter 是线程组&#xff0c;没什么区别。 02、 步骤的实现 Postman 和 jmeter 都是创建 http 请求 区别 1&#xff1a;postman 请求的URL 是一个整体&#xff0c;jmeter 分成了 4 个部分&#xff08;协议、主机、端…

chatgpt赋能Python-pythonsub

Python Sub- 快捷、高效的字符串替换工具 如果你是一个有大量文本替换需求的开发者&#xff0c;Python Sub 库是一个你一定不能错过的工具。Python Sub 是一个快捷、高效的字符串替换工具&#xff0c;帮助你快速轻松地替换字符串&#xff0c;优化你的工作效率。 Python Sub 提…

基于Java+Swing+mysql物业收费管理系统

基于JavaSwingmysql物业收费管理系统 一、系统介绍1. 居民管理模式:2. 物业管理员管理模式:3.项目说明 二、功能展示1.用户登陆2.查询缴费--业主3.历史账单3.资料设置4.生成账单--管理员5.收费记录--管理员6.用户管理--管理员 三、数据库四、其它系统五、获取源码 一、系统介绍…

rsync 远程同步+inotify实时同步部署

目录 一、rsync概述1.1 rsync服务器1.2 同步方式1.2-1 全量备份1.2-2 增量备份1.2-3 rsync同步源服务器1.2-4 scp与rsync的区别 二、配置rsync源2.1 基本思路2.2 配置文件rsyncd.conf2.3 独立的账号文件2.4 启用rsync服务2.5 rsync功能及特点2.5-1 rsync功能2.5-2 rsync特点 2.…

c++综合学习

1.函数调用 传值调用&#xff1a;在函数内部修改形式参数&#xff0c;不改编实际参数的值&#xff1b;引用调用&#xff1a;即指针调用&#xff0c;传入的是变量的指针&#xff0c;则在函数内部修改形式参数&#xff0c;实际参数跟着改变。 2. 数组 数组名即该数组的首地址&a…

chatgpt赋能Python-python_9

Python 9&#xff1a;提高SEO排名的最佳解决方案 对于许多公司和品牌&#xff0c;搜索引擎优化&#xff08;SEO&#xff09;是一项至关重要的任务。仅依靠传统广告和宣传的时代已经过去了&#xff0c;现在需要利用搜索引擎来增加流量和吸引更多客户。而Python 9则是一款已经被…

Linux权限2详解

粘滞位 现在我们学习了目录和普通文件的权限后&#xff0c;对这两种类型的文件权限都有了深刻的理解和认识&#xff0c;但是这又衍生出了一个新问题&#xff0c;这些目录/普通文件的使用都很局限&#xff0c;一旦设定了权限&#xff0c;别人都无法访问。 举个生活的例子&#x…

Jmeter性能测试工具之性能测试的概念

性能测试的概念 性能测试是指通过特定方式&#xff0c;对被测系统按照一定策略施加压力&#xff0c;获取系统 响应时间、TPS&#xff08;Transaction Per Second&#xff09;、吞吐量、资源利用率等性能指标&#xff0c;以期保证生产系统的性能能够满足用户需求的过程。 性能…

坚持刷题2个月,终于......

最近一个读者和我反馈&#xff0c;他坚持刷题2个月&#xff0c;终于去了他梦寐以求的大厂&#xff0c;薪资涨幅非常可观&#xff0c;期间面字节跳动还遇到了原题…并表示目前国内的大厂和一些独角兽&#xff0c;已经越来越效仿硅谷公司的做法&#xff0c;通过面试给定题&#x…

存放页的大池子——InnoDB表空间

在上一章节中&#xff0c;我们知道了提到了表空间&#xff0c;表空间里面没有直接存放表&#xff0c;有的是许多许多的页&#xff0c;我们也说了表空间的分类&#xff0c;有系统表空间&#xff0c;独立表空间&#xff0c;其他表空间。 每个新建的表都会在对应的数据库目录里面…

性能优化之影响分析

页面性能的影响 性能非常重要&#xff0c;而具体反映到我们的业务场景中&#xff0c;可能会有如下影响&#xff1a; 不利于用户留存 站点页面的展现速度非常影响用户体验&#xff0c;很多用户会因等待的不耐而放弃站点。研究表明&#xff0c;47 % 的消费者希望页面能够在 2s …

chatgpt赋能Python-python_bonjour

Python Bonjour&#xff1a; 通过Python实现Bonjour协议 介绍 Bonjour是苹果公司推出的一种新型、免配置的网络协议&#xff0c;它可以使局域网中的电脑、打印机、电话等各种设备自动发现及配置&#xff0c;从而促进了网络设备的普及。Python作为一种高效、简洁、易学的语言&…

【WSN覆盖】基于麻雀搜索算法的三维混合无线传感器网络覆盖优化 三维WSN覆盖空洞修复【Matlab代码#25】

文章目录 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】1. SSA算法2. 节点感知模型3. 三维混合WSN覆盖问题4. 部分代码展示5. 仿真结果展示6. 资源获取 【可更换其他算法&#xff0c;获取资源请见文章第6节&#xff1a;资源获取】 1. SSA算法 2. 节…

机器学习与深度学习——通过奇异值分解算法压缩图片

机器学习与深度学习——通过奇异值分解算法压缩图片 什么是奇异值分解&#xff1f; 奇异值分解&#xff08;Singular Value Decomposition&#xff0c;SVD&#xff09;是一种重要的线性代数方法&#xff0c;用于将一个矩阵分解成三个部分的乘积形式。它的应用非常广泛&#x…

Leecode98

leecode98 验证二叉搜索树 给定一个二叉树&#xff0c;判断其是否是一个有效的二叉搜索树。 假设一个二叉搜索树具有如下特征&#xff1a; 节点的左子树只包含小于当前节点的数。 节点的右子树只包含大于当前节点的数。 所有左子树和右子树自身必须也是二叉搜索树。 &#x1…

【Linux】shell编程—Here Document免交互

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 一、免交互概述二、免交互常规用法1.read 命令的读取2.wc -l 的内容行数统计3.passwd用户密码的修改4.cat 查看内容并输出到文件中5.cat 查看交互内容并输出到新的文…

Spring传播机制(七种)

一、概述 Spring在TransactionDefinition接口中规定了7种类型的事务传播行为。Propagation枚举则引用了这些类型&#xff0c;开发过程中我们一般直接用Propagation枚举。 1.1 Propagation源码 public enum Propagation {REQUIRED(0),SUPPORTS(1),MANDATORY(2),REQUIRES_NEW(…

redis源码浅析-ziplist实现

redis中的list是有多种实现的&#xff0c;其中一种是ziplist&#xff0c;其介绍如下 ziplist 是一个经过特殊编码的双向链表&#xff0c;旨在提高内存效率。 它存储字符串和整数值&#xff0c;其中整数被编码为实际整数而不是一系列字符。 它允许在 O(1) 时间内在列表的任一侧进…

戴尔 Dell Latitude E7480电脑 Hackintosh 黑苹果efi引导文件

原文来源于黑果魏叔官网&#xff0c;转载需注明出处。&#xff08;下载请直接百度黑果魏叔&#xff09; 硬件配置 硬件型号驱动情况 主板戴尔 Dell Latitude E7480 处理器Intel Core i7-7700U已驱动 内存8GB 2133MHz DDR4 * 2已驱动 硬盘Sandisk 1T M.2 NVMe SSD已驱动 显…

windows解决python安装django架构没有django-admin命令

目录 一.尝试安装与配置 1.直接pip命令安装 2.用pycharm测试 3.官网下包安装 二.解决 1.找到django安装的路径 2.配置系统变量 3.测试创建项目 3.1.执行访问页面 3.2.解决 3.3.继续测试 4.pycharm打开 一.尝试安装与配置 1.直接pip命令安装 pip install django dja…