Python JsonPath 详细使用
一、简介
JsonPath
是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript
,Python
,PHP
和Java
。JsonPath
对于JSON
来说,相当于XPATH
对于XML
,参考文章:JSON 数据解析(Json & JsonPath)
JSONPath-简单入门
goessner - JsonPath
Json
结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath
的用法(n/a
代表不支持):XPath JSONPath 描述 /
$
根节点 .
@
现行节点 /
.
or[]
取子节点 ..
n/a
取父节点, JsonPath
未支持//
..
就是不管位置,选择所有符合条件的条件 *
*
匹配所有元素节点 @
n/a
根据属性访问, Json
不支持,因为Json
是个Key-value
递归结构,不需要[]
[]
迭代器标示(可以在里边做简单的迭代操作,如数组下标,根据内容选值等) |
[,]
支持迭代器中做多选 []
?()
支持过滤操作 n/a
()
支持表达式计算 ()
n/a
分组, JsonPath
不支持
二、使用案例
安装
$ pip install jsonpath
本地案例测试数据,从 goessner - JsonPath 中拷贝的
{ "store": {"book": [ { "category": "reference","author": "Nigel Rees","title": "Sayings of the Century","price": 8.95},{ "category": "fiction","author": "Evelyn Waugh","title": "Sword of Honour","price": 12.99},{ "category": "fiction","author": "Herman Melville","title": "Moby Dick","isbn": "0-553-21311-3","price": 8.99},{ "category": "fiction","author": "J. R. R. Tolkien","title": "The Lord of the Rings","isbn": "0-395-19395-8","price": 22.99}],"bicycle": {"color": "red","price": 19.95}} }
本地案例
# 导入 json import json # 导入 jsonpath import jsonpath# 1、json 读取本地文件 obj = json.load(open('test.json', 'r', encoding='utf-8'))# 2、jsonpath 进行分析查找# 获取所有书籍的作者名称 list = jsonpath.jsonpath(obj, '$.store.book[*].author') # ['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien'] list = jsonpath.jsonpath(obj, '$..author') # ['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']# 获取 store 下面的所有元素 list = jsonpath.jsonpath(obj, '$.store.*') # [[{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}, ...], {'color': 'red', 'price': 19.95}]# 获取第 3 本书 list = jsonpath.jsonpath(obj, '$..book[2]') # [{'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99}]# 获取最后一本书 list = jsonpath.jsonpath(obj, '$..book[(@.length - 1)]') # [{'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]# 获取前 2 本书 list = jsonpath.jsonpath(obj, '$..book[0, 1]') # 错误写法,[0, 1]不能有空格,不然只会生效第一个值,后面的值不生效 list = jsonpath.jsonpath(obj, '$..book[0,1]') # [{'category': 'reference', 'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95}, {'category': 'fiction', 'author': 'Evelyn Waugh', 'title': 'Sword of Honour', 'price': 12.99}] list = jsonpath.jsonpath(obj, '$..book[:2]') # 切片写法,结果一样# 条件过滤需要再 () 前面添加一个 ? # 过滤出包含 isbn 的书 list = jsonpath.jsonpath(obj, '$..book[?(@.isbn)]') # [{'category': 'fiction', 'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99}, {'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]# 查询哪本书超过 10 块钱 list = jsonpath.jsonpath(obj, '$..book[?(@.price > 10)]') # [{'category': 'fiction', 'author': 'Evelyn Waugh', 'title': 'Sword of Honour', 'price': 12.99}, {'category': 'fiction', 'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99}]# 输出 print(list)
远程案例
# 测试某站的城市地址接口# 使用 urllib import urllib.request # 使用 json import json import jsonpath# 获取地址 url = 'https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1668502740745_108&jsoncallback=jsonp109&action=cityAction&n_s=new&event_submit_doGetAllRegion=true'# 请求头 headers = {# 带冒号的请求头都需要注释掉,报错:ValueError: Invalid header name b':Authority'# ':authority': 'dianying.taobao.com',# ':method': 'GET',# ':path': '/cityAction.json?activityId&_ksTS=1668502740745_108&jsoncallback=jsonp109&action=cityAction&n_s=new&event_submit_doGetAllRegion=true',# ':scheme': 'https',# 'accept': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01',# 报错:UnicodeDecodeError: 'utf-8' codec can't decode byte 0x8b in position 1: invalid start byte# 'accept-encoding': 'gzip, deflate, br','accept-language': 'zh-CN,zh;q=0.9','bx-v': '2.2.3','cookie': 't=1e424829769814085473c593565f4f5e; cookie2=17da1c30f22c22dd8d81dd3a871ab15b; v=0; _tb_token_=e817e63793373; cna=YQP5G0dsBVICAXToSX0EYCa1; xlly_s=1; isg=BPX1ozOY-se3Ah57r0dv0iYMBHevcqmEGFxmE3ca42y7ThVAP8MsVEZAmBL4DsE8; l=eBTcoCz7T1tElPbMBOfZnurza779LIRAguPzaNbMiOCP97CH57nFW6zmqRTMCnGVhsF9R3kzvXKpBeYBclYsjqj4axom4zHmn; tfstk=cJ1lBkVp-nisATNdcgO71aCmdIyOZYcej65fgrjQfnFphI1ViZkqQ2V7o3q_4v1..','referer': 'https://dianying.taobao.com/','sec-ch-ua': '"Google Chrome";v="107", "Chromium";v="107", "Not=A?Brand";v="24"','sec-ch-ua-mobile': '?0','sec-ch-ua-platform': '"macOS"','sec-fetch-dest': 'empty','sec-fetch-mode': 'cors','sec-fetch-site': 'same-origin','user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/107.0.0.0 Safari/537.36','x-requested-with': 'XMLHttpRequest' }# 请求对象 request = urllib.request.Request(url=url, headers=headers)# 模拟浏览器向服务器发起请求 response = urllib.request.urlopen(request)# 响应数据转成字符串 content = response.read().decode('utf-8')# 会发现拿回来的数据是一个 jsonp109({xx: xx}); 包裹的字符串,放到 https://www.json.cn/ 解析也失败 # 解决办法:删除 'jsonp109(' 与后面的 ');' 即可 # 代码切割 content = content.split('(')[1].split(')')[0]# 字符串转 json obj = json.loads(content)# 将内容写入文件(使用 json.loads() 则不需要存储) with open('test.json', 'w', encoding='utf-8') as f:f.write(content)# 方式一:读取文件(需要存储,在读出来) obj = json.load(open('test.json', 'r', encoding='utf-8')) # 方式二:字符串转 json(不需要存储,直接使用) # obj = json.loads(content)# 导出所有 regionName 名称 regionNames = jsonpath.jsonpath(obj, '$..regionName')# 输出 print(regionNames)
Python JsonPath 详细使用相关推荐
- python详细安装步骤-Python的详细安装步骤
这是一篇关于如何安装Python的详细教程,经过下面的解读,然后跟着以下步骤,你也可以在自己的电脑安装Python了! 一. Python简介: Python在Linux.windows.Mac os ...
- python详细安装步骤-Pycharm及python安装详细教程(图解)
首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/ ),进入之后如下图,选择图中红色圈中区域进行下载. 2 ...
- 电脑安装python步骤-windows10系统安装python的详细步骤
Python是一门受广大用户所喜爱欢迎的.使用广泛的语言.最近,就有一些升级win10正式版的用户反映自己想要在新系统中安装Python软件,但是又不知道该如何操作.接下来,小编就为大家分享win10 ...
- r语言和python-r语言和python的详细对比
r语言和python的对比,两者各有千秋,究竟要学哪一个,可根据自己的实际需求来作出选择,当然,最好是两者都学. 01 开发目的 R语言 R是由统计学家开发的,它的出生就肩负着统计分析.绘图.数据挖掘 ...
- 安装python应该先安装pycharm还是python_Pycharm及python安装详细步骤及PyCharm配置整理(推荐)...
首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址: https://www.python.org/downloads/),进入之后如下图,选择图中红色圈中区域进行下载. ...
- Python JSONPath示例
什么是JSONPath? (What is JSONPath?) JSONPath is an expression language to parse JSON data. It's very si ...
- python详细安装教程-Pycharm及python安装详细教程(图解)
首先我们来安装python 1.首先进入网站下载:点击打开链接(或自己输入网址https://www.python.org/downloads/ ),进入之后如下图,选择图中红色圈中区域进行下载. 2 ...
- 机器学习常用的六种分类方法,Python代码详细都在这里!
机器学习常用的六种分类方法,Python代码详细都在这里! 六种常用分类方法包括两种线性分类及四种非线性分类法,分别是: 一.线性判别分析 from sklearn.model_selection i ...
- 2023年美赛C题Wordle预测问题一建模及Python代码详细讲解
相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详细讲解 (3)2023年美赛C题Wordl ...
- 2023年美赛C题Wordle预测问题三、四建模及Python代码详细讲解
更新时间:2023-2-19 16:30 相关链接 (1)2023年美赛C题Wordle预测问题一建模及Python代码详细讲解 (2)2023年美赛C题Wordle预测问题二建模及Python代码详 ...
最新文章
- 面试谈薪,被 HR 压价,怎么办?
- 大数据量表中,增加一个NOT NULL的新列
- extjs之TypeError: d.read is not a function解决方案
- DL HARQ UCI in PUCCH — R16
- 一句话讲清楚GIL锁
- python绘制两个离散变量关系图——马赛克图
- 计算机日志研究方法,基于日志的计算机取证技术研究与实现
- @RestControllerAdvice与@ControllerAdvice的区别
- 深入理解JVM虚拟机-Ubuntu中安装openJDK
- 2020ccks知识图谱问答总结
- 四旋翼无人机原理以及组装过程
- 笔记本取消fn +功能键
- p-7-24青蛙跳台阶
- 目前的云计算,主要存在的问题有哪些?
- 随笔——物质与思想(或称意识)
- cogs 448. 神牛果 神奇好理解的思路
- android GPS 定位
- 如何优雅的在mac上使用latex
- 跟我一起做微信开发(一)——开通微信公共号(开发模式)
- DocuWare 文件管理与工作流程自动化案例研究——DocuWare 工作流程功能使在家工作的员工能够保持沟通和高效工作,支持混合环境
热门文章
- 论文阅读:Region Proposal by Guided Anchoring
- gentoo linux软件安装,Gentoo Linux 快速安装方法安装
- 五、构建deb软件安装包
- 通过css为类生成器给文本字体加上书名号,
- http://www.cnblogs.com/xd502djj/p/3473516.html
- Django | ORM choices参数详解
- MSP430第三十二章:Comp_B
- oracle rman delete backupset,RMAN Crosscheck后delete obsolete遇到RMAN-06091的解决
- html在搜索栏中加入放大镜,CSS3 搜索条动画(放大镜图标展开为长方形输入框)...
- Android放大镜实现的两种方式