• Python爬虫——JsonPath解析方式


    Python爬虫——JsonPath解析方式

    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文件地址:http://www.lagou.com/lbs/getAllCitySearchLabels.json,需要保存JSON文件到本地。

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13

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

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12

    执行结果:

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17

    执行结果:

    [{'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}]
    ['成都', '重庆', '长沙']
    ['成都', '重庆', '长沙']
    
    • 1
    • 2
    • 3
    • 4

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    执行结果:

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

    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)
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    执行结果:

    [{'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}]
    
    • 1
    • 2
  • 相关阅读:
    为什么和线程有关的方法会被封装在Object类中
    【数学模型】TOPSIS
    Springboot 小巧简便的限流器使用 RateLimiter
    Python操作HDF5文件示例
    基于SpringBoot的校园志愿者管理系统
    POI生成Word水印watermark(兼容WPS)的终极解决方案
    网络安全(黑客)自学
    信息科技风险管理
    学习 Kubernetes的难点和安排
    基于vue天气数据可视化平台
  • 原文地址:https://blog.csdn.net/wpc2018/article/details/126056947