jsonpath介绍
用来解析多层嵌套的json数据;JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。
安装方法:pip install jsonpath
官方文档:http://goessner.net/articles/JsonPath
语法: jsonpath.jsonpath(python数据类型,筛选条件)
没筛选到则返回False,筛选到则返回一个列表
import jsonpath
dict_data = {"store": {
"book": [
{"category": "reference",
"author": "吴承恩",
"title": "西游记",
"price": 8.95
},
{"category": "fiction",
"author": "曹雪芹",
"title": "红楼梦",
"price": 12.99
},
{"category": "fiction",
"author": "罗贯中",
"title": "三国演义",
"isbn": "0-553-21311-3",
"price": 8.99
},
{"category": "fiction",
"author": "施耐庵",
"title": "水浒传",
"isbn": "0-395-19395-8",
"price": 22.99
}
],
"bicycle": {
"color": "red",
"price": 19.95
}
}
}
# # 获取store的值
# # $ 根节点 .选取子节点
# bookList = jsonpath.jsonpath(dict_data, "$.store")
# print(bookList) # 返回的是一个列表
# # # 获取book的值 (键=《book,值=》列表)
# bookList = jsonpath.jsonpath(dict_data, "$.store.book")
# print(bookList) # 返回的是一个列表
#
# # 获取book所有值 (列表里面的值)
# # * 匹配所有的元素
# bookList = jsonpath.jsonpath(dict_data, "$.store.book.*")
# print(bookList) # 返回的是一个列表
# # 获取book的值 ..
# # .. 跨节点
# bookList = jsonpath.jsonpath(dict_data, "$..book")
# print(bookList) # 返回的是一个列表
#
# bookList = jsonpath.jsonpath(dict_data, "$..book.*")
# print(bookList) # 返回的是一个列表
# 总结:. 和 ..
# . 选取子节点必须要一个一个取,直到定位到对应的节点元素为止
# .. 直接跨过中间的节点,定位到要取的节点
# # 获取第三本书的信息
# # 同学们还记不得列表怎么取单个值?
# # [] 迭代器表示(下标取值) 下标也是从0开始
# bookList = jsonpath.jsonpath(dict_data, "$..book[2]")
# print(bookList) # 返回的是一个列表
# # 获取前两本书的信息(第一本和第二本)
# # [,] 支持在迭代器中取多个值 切片 [初始值:结束值]
# bookList = jsonpath.jsonpath(dict_data, "$..book[0,1]") # 注意:包前包后
# print(bookList) # 返回的是一个列表
# bookList = jsonpath.jsonpath(dict_data, "$..book[:2]") # 注意:包前不包后
# print(bookList) # 返回的是一个列表
# # 最后一本书
# # @当前选中的节点 @.length 获取长度的 相当于len() () 支持表达式计算
# bookList = jsonpath.jsonpath(dict_data, "$..book[(@.length-1)]") # 下标从0开始
# print(bookList) # 返回的是一个列表
# # 获取有author的所有值
# # [] 根据内容选值 ?()根据条件过滤 @当前选中的节点
# bookList = jsonpath.jsonpath(dict_data, "$..book[?(@.author)]")
# print(bookList) # 返回的是一个列表
# # 获取所有isbn的值
# bookList = jsonpath.jsonpath(dict_data, "$..book[?(@.isbn)]")
# print(bookList) # 返回的是一个列表
# # 获取价格小于10的所有书
# bookList = jsonpath.jsonpath(dict_data, "$..book[?(@.price <10)]")
# print(bookList) # 返回的是一个列表
我们以拉勾网城市JSON文件为例
http://www.lagou.com/lbs/getAllCitySearchLabels.json
使用fiddler抓取到https的数据包,复制到JSON在线解析及格式化验证 - JSON.cn上查看,如图:
本次目标要提取出content中abstract的值,但是content这个节点的内容却是字符串了,
所以
第一步先"$..content"提取出content的列表,
第二步遍历content的列表转换为json数据(python数据)
最后再使用jsonpath语法提取abstract的值
代码如下: