【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