Python爬虫——JsonPath解析方式

332 阅读3分钟

携手创作,共同成长!这是我参与「掘金日新计划 · 8 月更文挑战」的第23天,点击查看活动详情

1、JsonPath简介

==JSONPath 是一个类似 XPath 的 JSON 工具,可以从JSON文档中提取指定信息==,并且JSONPath 提供多种语言实现版本,包括:JavaScript、Python、PHP和Java。

JSONPath 表达式始终引用 JSON 结构,就像 XPath 表达式与 XML/HTML文档结合使用一样。

JsonPath 和 XPath 的比较 :

  • JsonPath 只能解析本地的文件,不能解析服务器上的文件
  • JsonPath 结构清晰,可读性高,复杂度低,非常容易匹配

JsonPath 与 XPath 的语法对比如下图所示:

1562210597(1).png

JSONPath 官方文档

2、JsonPath的安装

JsonPath安装位置:Python安装目录的Scripts文件夹下

安装命令:pip install jsonpath

如图所示下载成功:

在这里插入图片描述

3、jsonpath的使用

使用实例一:以全国城市的JSON文件为例

全国城市的JSON文件地址:www.lagou.com/lbs/getAllC…

1、获取以字母A为开头的所有城市名称

import json
import jsonpath

# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
# 获取所有 A[*]
nameA_list = jsonpath.jsonpath(city_json,'$.content.data.allCitySearchLabels.A[*].name')
# 获取下标为2的数据 A[2],[0]:获得列表的内容
name2 = jsonpath.jsonpath(city_json,'$.content.data.allCitySearchLabels.A[2].name')[0]
print(nameA_list)
print(name2)

执行结果:jsonpath解析返回的数据是列表类型

['安阳', '安庆', '鞍山', '阿克苏', '安顺', '安康', '澳门', '阿拉尔', '阿里地区', '阿拉善盟']
鞍山

2、获取所有城市的名称

import json
import jsonpath

# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)
# 获取所有城市的名称和编码code
name_list = jsonpath.jsonpath(city_json,'$..name')
code_list = jsonpath.jsonpath(city_json,'$..code')
print(name_list)
print(code_list)

3、获取以字母B为开头的最后一个城市和名称

import json
import jsonpath

# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)

name_list = jsonpath.jsonpath(city_json,'$..B[(@.length-1)]')
name = jsonpath.jsonpath(city_json,'$..B[(@.length-1).name]')
print(name_list)
print(name)

执行结果:

[{'id': 597, 'name': '巴彦淖尔', 'parentId': 534, 'code': '070400000', 'isSelected': False}]
['巴彦淖尔']

4、获取以字母C为开头的前两个城市

import json
import jsonpath

# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)

# C[0,1,2] 和 C[:3]作用相同,都是获得前三个数据
name_list = jsonpath.jsonpath(city_json,'$..C[0,1,2]')
name_list1 = jsonpath.jsonpath(city_json,'$..C[:3]')
name = jsonpath.jsonpath(city_json,'$..C[0,1,2].name')
name1 = jsonpath.jsonpath(city_json,'$..C[:3].name')
print(name_list)
print(name_list1)
print(name)
print(name1)

执行结果:

[{'id': 801, 'name': '成都', 'parentId': 552, 'code': '230100000', 'isSelected': False}, {'id': 8, 'name': '重庆', 'parentId': 4, 'code': '040100000', 'isSelected': False}, {'id': 749, 'name': '长沙', 'parentId': 547, 'code': '190100000', 'isSelected': False}]
[{'id': 801, 'name': '成都', 'parentId': 552, 'code': '230100000', 'isSelected': False}, {'id': 8, 'name': '重庆', 'parentId': 4, 'code': '040100000', 'isSelected': False}, {'id': 749, 'name': '长沙', 'parentId': 547, 'code': '190100000', 'isSelected': False}]
['成都', '重庆', '长沙']
['成都', '重庆', '长沙']

5、获取以字母G为开头且包含provincialCapital的城市

import json
import jsonpath

# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)

city = jsonpath.jsonpath(city_json,'$..G[?(@.provincialCapital)]')
print(city)

执行结果:

[{'id': 763, 'name': '广州', 'parentId': 548, 'code': '200100000', 'isSelected': False, 'provincialCapital': True}]

6、获取以字母C为开头且price大于13000的城市

import json
import jsonpath

# 读取json文件
file = open('lagou.json','r',encoding='utf-8')
# 反序列化
city_json = json.load(file)

city = jsonpath.jsonpath(city_json,'$..C[?(@.price>13000).name]')
print(city)

执行结果:

[{'id': 801, 'name': '成都', 'parentId': 552, 'code': '230100000', 'isSelected': False, 'provincialCapital': True, 'price': 15000}, 
{'id': 8, 'name': '重庆', 'parentId': 4, 'code': '040100000', 'isSelected': False, 'price': 17000}, {'id': 749, 'name': '长沙', 'parentId': 547, 'code': '190100000', 'isSelected': False, 'price': 16000}]