安装:python -m pip install jsonpath
Json结构清晰,可读性高,复杂度低,非常容易匹配,下表中对应了XPath的用法。
Xpath | JSONPath | 描述 |
---|---|---|
/ | $ | 跟节点 |
. | @ | 现行节点 |
/ | . or [] | 取子节点 |
.. | n/a | 就是不管位置,选择所有符合条件的条件 |
* | * | 匹配所有元素节点 |
[] | [] | 迭代器标示(可以在里面做简单的迭代操作,如数组下标,根据内容选值等) |
| | [,] | 支持迭代器中做多选 |
[] | ?() | 支持过滤操作 |
n/a | () | 支持表达式计算 |
() | n/a | 分组,JsonPath不支持 |
获取当前json数据中某节点数据:
jsonpath.jsonpath(html,’$..read_count’)
获取根节点下某节点数据:
jsonpath.jsonpath(html,’$.msg’)
获取子节点下第1、2个数据
jsonpath.jsonpath(html,’$.data.post_author.post_list[0:2]’)
按条件筛选节点下数据:
jsonpath.jsonpath(html,’$..data.post_author.post_list[?(@.read_count>10)]’)
import requests,jsonpath
#. or [] 取子节点
#.. 不管位置,选择所有符合条件的节点
shop=requests.get(url="").json()
#商店里所有书籍的作者
author_list=jsonpath.jsonpath(shop,'$.store.book[*].author')
#返回所有的作者
author_list2=jsonpath.jsonpath(shop,'$..author')
#商店里的所有东西
category_dx=jsonpath.jsonpath(shop,'$.store.*')
#商店里一切的价格
store_price_list=jsonpath.jsonpath(shop,'$.store..price')
#第三本书
book_3=jsonpath.jsonpath(shop,'$..book[2]')
#最后一本书
book_last=jsonpath.jsonpath(shop,'$..book[-1]')
num=len(jsonpath.jsonpath(shop,'$..book'))-1
book_last=jsonpath.jsonpath(shop,f'$..book[{num}]') #取值
#前两本书
book_12=jsonpath.jsonpath(shop,f'$..book[0,1]')
#过滤所有便宜10以上的书籍
book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.price<10)]')
#使用isbn number过滤所有书籍
book_lg10=jsonpath.jsonpath(shop,'$..book[?(@.isbn)]')
# !/usr/bin/env python
# -*- coding:utf-8 -*-
import json
import jsonpath
import requests
url='https://www.lagou.com/lbs/getAllCitySearchLabels.json'
resp=requests.get(url)
city_json=resp.text
# json字符串转换为python字典对象
city_dict=json.loads(city_json)
# 使用jsonpath匹配
# 获取根节点下的所有name节点的值
names=jsonpath.jsonpath(city_dict,expr='$..name')
print(names)
# 根节点下的message节点的值
message=jsonpath.jsonpath(city_dict,expr='$.message')
print(message)
# D节点下的前3个
D=jsonpath.jsonpath(city_dict,expr='$.content.data.allCitySearchLabels.D[0:3]')
print(D)
# D节点下的第2个和第4个
D=jsonpath.jsonpath(city_dict,expr='$.content.data.allCitySearchLabels.D[1,3]')
print(D)
其他还有jsonpath-rw、jsonpath-ng等