【Python JsOnpath提取语法 11】
JSONPath是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括Javascript、Python、PHP和Java(如:数据json类型提取,接口返回值提取)。
特点:
- 获取不到返回False,不会报错
- 返回的类型是list
安装
pip install jsonpath
jsonpath的使用:
obj = json.load(open('json文件', 'r', encoding='utf‐8'))
ret = jsonpath.jsonpath(obj, 'jsonpath语法')
jsonpath语法元素和对应XPath元素的对比:
| XPATH | JSONPATH | 描述 |
| / | $ | 根节点 |
| . | @ | 现行节点 |
| / | .or[] | 取子节点 |
| .. | n/a | 取父节点,JSONPath未支持 |
| // | .. | 不管位置,选择所有符合条件的节点 |
| * | * | 匹配所有元素节点 |
| @ | n/a | 根据属性访问,JSON不支持,因为JSON是个key-value递归结构,不需要属性访问 |
| [] | [] | 迭代器标示(可以在里面做简单的迭代操作,如数组下标、根据内容选值等) |
| | | [,] | 支持迭代器中做多选 |
| [] | ?() | 支持过滤操作 |
| n/a | () | 分组,JSONPath不支持 |
实例操作:
data = {
"store": {
"book": [
{ "category": "修真",
"author": "六道",
"title": "坏蛋是怎样练成的",
"price": 8.95
},
{ "category": "修真",
"author": "天蚕土豆",
"title": "斗破苍穹",
"price": 12.99
},
{ "category": "修真",
"author": "唐家三少",
"title": "斗罗大陆",
"isbn": "0-553-21311-3",
"price": 8.99
},
{ "category": "修真",
"author": "南派三叔",
"title": "星辰变",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"author": "老马",
"color": "黑色",
"price": 19.95
}
}
}
| JsonPath (点击链接测试) | 结果 |
|---|---|
$.store.book[*].author |
获取json中store下book下的所有author值 |
$..author |
获取所有json中所有author的值 |
$.store.* |
所有的东西 |
$.store..price |
获取json中store下所有price的值 |
$..book[2] |
获取json中book数组的第3个值 |
$..book[-2] |
倒数的第二本书 |
$..book[0,1] |
前两本书 |
$..book[:2] |
从索引0(包括)到索引2(排除)的所有图书 |
$..book[1:2] |
从索引1(包括)到索引2(排除)的所有图书 |
$..book[-2:] |
获取json中book数组的最后两个值 |
$..book[2:] |
获取json中book数组的第3个到最后一个的区间值 |
$..book[?(@.isbn)] |
获取json中book数组中包含isbn的所有值 |
$.store.book[?(@.price < 10)] |
获取json中book数组中price<10的所有值 |
$..book[?(@.price <= $['expensive'])] |
获取json中book数组中price<=expensive的所有值 |
$..book[?(@.author =~ /.*REES/i)] |
获取json中book数组中的作者以REES结尾的所有值(REES不区分大小写) |
$..* |
逐层列出json中的所有值,层级由外到内 |
$..book.length() |
获取json中book数组的长度 |
data = {
"student":
[
{"name":"逍遥","age":"13",},
{"name":"星瀚","age":"11"},
{"name":"骆驼","age":"15"},
{"school":"101中学"}
]
}
'''
..表示通过相对路径取值,通过递归取值
'''
print('$.student======',jsonpath.jsonpath(data,"$.student")) #获取student下所有的数据
print('$[student]=======',jsonpath.jsonpath(data,"$[student..school]")) #获取student下所有的数据,区别在于[]它的功能更强大,如[$[student..school]
print('$.school========',jsonpath.jsonpath(data,"$..school")) #获取到任意指定key的value值
print('$.*=======',jsonpath.jsonpath(data,"$.*")) #获取student下所有的数据
结果:
$.student====== [[{'name': '逍遥', 'age': '13'}, {'name': '星瀚', 'age': '11'}, {'name': '骆驼', 'age': '15'}, {'school': '101中学'}]]
$[student]======= ['101中学']
$.school======== ['101中学']
$.*======= [[{'name': '逍遥', 'age': '13'}, {'name': '星瀚', 'age': '11'}, {'name': '骆驼', 'age': '15'}, {'school': '101中学'}]]
更加详细Jsonpath内容:https://www.cnblogs.com/wynjauu/articles/9556396.html
