JsonPath 是一种信息抽取类库,是从JSON文档中抽取指定信息的工具,提供多种语言实现版本,包括:Javascript, Python, PHP 和 Java。也就是独立的可以配合多种语言进行匹配的目标值的一种类库,和jmeter中的jsonPath匹配方式很像(具体参考此文章:https://www.cnblogs.com/Zhan-W/p/10985816.html )。优点之一: 数据可以通过交互方式从客户端上的JSON结构提取,不需要特殊的脚本。
- 只能提取json格式的数据
- 提取后的数据类型与原数据类型一致
pip install jsonpath -i https://pypi.doubanio.com/simple
官方文档:JSONPath - XPath for JSON
import requests
import json
import jsonpath
if __name__ == '__main__':
# 1.确认目标url
url_ = 'https://www.lagou.com/lbs/getAllCitySearchLabels.json'
# 用户代理的代理
headers_ = {
'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/98.0.4758.102 Safari/537.36'
}
# 2.发送网络请求,获取响应对象
response_ = requests.get(url_, headers=headers_)
#获取python格式,自动类型转换
py_data=response_.json() # json()这是一个方法
print(type(py_data),py_data)
# $:根元素
#(1)获取所有城市名称
names=jsonpath.jsonpath(py_data,'$..name')
print(len(names),names)
# .or []:子元素
#(2)获取所有城市中按字母分类的第一个城市的所有信息
res=jsonpath.jsonpath(py_data,"$..allCitySearchLabels.*[:1]")
print(len(res),res)
# [, ]:支持迭代器中做多选,多个key用逗号隔开
#(3)获取A字母的城市名和父城市id
res=jsonpath.jsonpath(py_data,"$..A.[name,parentId]")
print(len(res),res)
#(4)获取B字母的城市下的第0个和第16个城市信息
res=jsonpath.jsonpath(py_data,"$..B[0,16]")
print(len(res),res)
# [start:end:step]:数组分割操作,等同于切片, 遵循左闭右开原则
#(5)获取B字母的城市下的前2个城市信息
res=jsonpath.jsonpath(py_data,"$..B[:2]")
print(len(res),res)
# ?():应用过滤表示式
#(6)获取B字母的城市下的id编号大于850的信息
res=jsonpath.jsonpath(py_data,"$..B.[?(@.id>850)]")
print(len(res),res)
# == :等于
# (7)查询城市是福州的城市信息
res = jsonpath.jsonpath(py_data, "$..*[?(@.name=='福州')]")
print(len(res), res)
# in :所属符号
# (8)查询城市是杭州,北京,天津的城市信息
res = jsonpath.jsonpath(py_data, "$..*[?(@.name in ['杭州','北京','天津'])]")
print(len(res), res)
# (8)查询城市是杭州,北京,天津的code信息
res = jsonpath.jsonpath(py_data, "$..*[?(@.name in ['杭州','北京','天津'])].code")
print(len(res), res)
# not in :排除符号
# (9)查询城市不是杭州,北京,天津的城市信息
res = jsonpath.jsonpath(py_data, "$..*[?(@.name not in ['杭州','北京','天津'])]")
print(len(res), res)
# &&:逻辑AND,用于合并多个过滤器表达式
# (10)查询城市是杭州,并且ID是653的城市信息
res = jsonpath.jsonpath(py_data, "$..*[?(@.name =='杭州' && @.id==653)]")
print(len(res), res)
# || 逻辑OR,用于组合多个过滤器表达式
# (11)查询城市是杭州, 或者ID大于1000的城市信息
res = jsonpath.jsonpath(py_data, "$..*[?(@.name =='杭州' || @.id>1000)]")
print(len(res), res)