解析: jsonpath

发布时间 2023-04-12 00:01:23作者: yub4by
{
  "store": {
    "book": [
      { "category": "修真",
        "author": "六道",
        "title": "坏蛋是怎样练成的",
        "price": 8.95
      },
      { "category": "修真",
        "author": "天蚕土豆",
        "title": "斗破苍穹",
        "price": 12.99
      },
      { "category": "修真",
        "author": "唐家三少",
        "title": "斗罗大陆",
        "isbn": "0-553-21311-3",
        "price": 8.99
      },
      { "category": "修真",
        "author": "南派三叔",
        "title": "星辰变",
        "isbn": "0-395-19395-8",
        "price": 22.99
      }
    ],
    "bicycle": {
      "author": "老马",
      "color": "黑色",
      "price": 19.95
    }
  }
}
"""                                                           
                                       .-''-.               
.--.                    _..._        .' .-.  )              
|__|                  .'     '.     / .'  / /               
.--..-,.--.          .   .-.   .   (_/   / /                
|  ||  .-. |         |  '   '  |        / /                 
|  || |  | | _    _  |  |   |  |       / /         _    _   
|  || |  | || '  / | |  |   |  |      . '         | '  / |  
|  || |  '-.' | .' | |  |   |  |     / /    _.-').' | .' |  
|__|| |    /  | /  | |  |   |  |   .' '  _.'.-'' /  | /  |  
    | |   |   `'.  | |  |   |  |  /  /.-'_.'    |   `'.  |  
    |_|   '   .'|  '/|  |   |  | /    _.'       '   .'|  '/ 
           `-'  `--' '--'   '--'( _.-'           `-'  `--'  
Created on 2023/4/11 22:06.
@Author: haifei
"""
import time
import jsonpath
import json

'''
教程:http://blog.csdn.net/luxideyao/article/details/77802389
注意:jsonpath只能解析本地文件
'''


obj = json.load(open(file='解析_3_jsonpath.json', mode='r', encoding='utf-8'))
print(obj)

# 书店所有书的作者
author_list = jsonpath.jsonpath(obj, '$.store.book[*].author')
print(author_list)  # ['六道', '天蚕土豆', '唐家三少', '南派三叔']

# 书店第2本书的作者
author = jsonpath.jsonpath(obj, '$.store.book[1].author')
print(author)  # ['天蚕土豆']

# 所有的作者
author_list = jsonpath.jsonpath(obj, '$..author')  # jsonpath的..相当于xpath的//
print(author_list)  # ['六道', '天蚕土豆', '唐家三少', '南派三叔', '老马']

# store下面的所有的元素
tag_list = jsonpath.jsonpath(obj, '$.store.*')
print(tag_list)

# store里面所有东西的price
price_list = jsonpath.jsonpath(obj, '$.store..price')
print(price_list)  # [8.95, 12.99, 8.99, 22.99, 19.95]

# 第三本书
book = jsonpath.jsonpath(obj, '$..book[2]')
print(book)  # [{'category': '修真', 'author': '唐家三少', 'title': '斗罗大陆', 'isbn': '0-553-21311-3', 'price': 8.99}]

# 最后一本书
book = jsonpath.jsonpath(obj, '$..book[(@.length-1)]')
print(book)  # [{'category': '修真', 'author': '南派三叔', 'title': '星辰变', 'isbn': '0-395-19395-8', 'price': 22.99}]

# 前面的两本书
# book_list = jsonpath.jsonpath(obj, '$..book[0,1]')  # 类似py切片
book_list = jsonpath.jsonpath(obj, '$..book[:2]')  # 同理
print(book_list)

# 过滤出所有包含isbn的书
book_list = jsonpath.jsonpath(obj, '$..book[?(@.isbn)]')  # 条件过滤需要在()的前面添加一个?
print(book_list)

# 价格超过了10块钱的书
book_list = jsonpath.jsonpath(obj, '$..book[?(@.price>10)]')
print(book_list)


if __name__ == '__main__':
    start = time.time()
    print('It takes', time.time() - start, "seconds.")


"""                                                           
                                       .-''-.               
.--.                    _..._        .' .-.  )              
|__|                  .'     '.     / .'  / /               
.--..-,.--.          .   .-.   .   (_/   / /                
|  ||  .-. |         |  '   '  |        / /                 
|  || |  | | _    _  |  |   |  |       / /         _    _   
|  || |  | || '  / | |  |   |  |      . '         | '  / |  
|  || |  '-.' | .' | |  |   |  |     / /    _.-').' | .' |  
|__|| |    /  | /  | |  |   |  |   .' '  _.'.-'' /  | /  |  
    | |   |   `'.  | |  |   |  |  /  /.-'_.'    |   `'.  |  
    |_|   '   .'|  '/|  |   |  | /    _.'       '   .'|  '/ 
           `-'  `--' '--'   '--'( _.-'           `-'  `--'  
Created on 2023/4/11 23:24.
@Author: haifei
"""
import time
import json
import jsonpath
from urllib import request


'''
在淘票票官网抓到的城市列表接口
https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1681226575080_112&jsoncallback=jsonp113&action=cityAction&n_s=new&event_submit_doGetAllRegion=true
拷贝其response中的json数据,保存到本地json文件,进而jsonpath处理
也可以通过爬虫进行自动下载该json数据,如下
'''


url = 'https://dianying.taobao.com/cityAction.json?activityId&_ksTS=1681226575080_112&jsoncallback=jsonp113&action=cityAction&n_s=new&event_submit_doGetAllRegion=true'
headers = {
    # ':authority': 'dianying.taobao.com',
    # ':method': 'GET',
    # ':path': '/cityAction.json?activityId&_ksTS=1681226575080_112&jsoncallback=jsonp113&action=cityAction&n_s=new&event_submit_doGetAllRegion=true',
    # ':scheme': 'https',
    'accept': 'text/javascript, application/javascript, application/ecmascript, application/x-ecmascript, */*; q=0.01',
    # 'accept-encoding': 'gzip, deflate, br',
    'accept-language': 'zh-CN,zh;q=0.9,en;q=0.8,en-GB;q=0.7,en-US;q=0.6',
    'bx-v': '2.2.3',
    'cookie': 'miid=302527251017658799; cna=lwkQGlHdVS4CAXAGfLivMq+i; t=d1c9b28bafb4a6e98d866ae6637715ed; cookie2=12ca7ad144b01c7b86ab78e5fa0ee5c0; v=0; _tb_token_=e16a356a3bb5e; xlly_s=1; tfstk=cxZABVXA_TpAa01i4mQk_ROcfYWhZB5tNKGMXkDJ5Zpp1JKOipr3vbcAlAGEMTC..; l=fBIDL0_cN_wObMwMBO5Bhurza779fIdb4sPzaNbMiIEGa6tCtFg1xOCsPWR2SdtjgTCxketPM0Td7RLHRnsi5c0c07kqm0R-exvtaQtJe; isg=BBMTRX9ncw8qwzi4M-086-BXopE9yKeKnPkwJ8UxjTJpRDPmTZjD2iLafrQqZP-C',
    'referer': 'https://dianying.taobao.com/',
    'sec-ch-ua': '" Not A;Brand";v="99", "Chromium";v="99", "Microsoft Edge";v="99"',
    'sec-ch-ua-mobile': '?0',
    'sec-ch-ua-platform': '"macOS"',
    'sec-fetch-dest': 'empty',
    'sec-fetch-mode': 'cors',
    'sec-fetch-site': 'same-origin',
    'user-agent': 'Mozilla/5.0 (Macintosh; Intel Mac OS X 10_15_7) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/99.0.4844.51 Safari/537.36 Edg/99.0.1150.39',
    'x-requested-with': 'XMLHttpRequest',
}
_request = request.Request(url=url, headers=headers)
response = request.urlopen(_request)
content = response.read().decode('utf-8')
content = content.split('(')[1].split(')')[0]  # 接口元数据不是标准json,需要掐头去尾
with open(file='./download/解析_4_jsonpath解析淘票票城市列表2.json', mode='w', encoding='utf-8') as fp:
    fp.write(content)

obj = json.load(open(file='./download/解析_4_jsonpath解析淘票票城市列表2.json', mode='r', encoding='utf-8'))
city_list = jsonpath.jsonpath(obj, '$..regionName')
print(city_list)


if __name__ == '__main__':
    start = time.time()
    print('It takes', time.time() - start, "seconds.")

['阿坝', '阿克苏', '阿拉善', '阿勒泰', '安康', '安庆', '鞍山', '安顺', '安阳', '白城', '百色', '白沙', '白山', '白银', '保定', '宝鸡', '保山', '包头', '巴彦淖尔', '巴中', '北海', '北京', '蚌埠', '本溪', '毕节', '滨州', '亳州', '巴音郭楞', '沧州', '长春', '常德', '昌吉', '昌江', '长沙', '长治', '常州', '朝阳', '潮州', '承德', '成都', '澄迈县', '郴州', '赤峰', '池州', '重庆', '崇左', '楚雄', '滁州', '大理', '大连', '儋州', '丹东', '大庆', '大同', '大兴安岭', '达州', '屯昌', '德宏', '德阳', '德州', '定安', '定西', '迪庆', '东方', '东莞', '东营', '鄂尔多斯', '恩施', '鄂州', '防城港', '佛山', '抚顺', '阜新', '阜阳', '抚州', '福州', '甘南', '赣州', '甘孜', '巩义市', '广安', '广元', '广州', '贵港', '桂林', '贵阳', '固原', '哈尔滨', '海北', '海东', '海口', '海南州', '海西', '哈密', '邯郸', '杭州', '汉中', '鹤壁', '河池', '合肥', '鹤岗', '黑河', '衡水', '衡阳', '和田', '河源', '菏泽', '贺州', '红河', '淮安', '淮北', '怀化', '淮南', '黄冈', '黄南', '黄山', '黄石', '呼和浩特', '惠州', '葫芦岛', '呼伦贝尔', '湖州', '佳木斯', '吉安', '江门', '焦作', '嘉兴', '嘉峪关', '揭阳', '吉林', '济南', '金昌', '晋城', '景德镇', '荆门', '荆州', '金华', '济宁', '晋中', '锦州', '九江', '酒泉', '鸡西', '济源', '开封', '喀什', '克拉玛依', '克孜勒苏柯尔克孜', '昆明', '来宾', '廊坊', '兰州', '拉萨', '乐东', '乐山', '凉山', '连云港', '聊城', '辽阳', '辽源', '丽江', '临沧', '临汾', '临高', '临夏', '临沂', '林芝', '丽水', '六安', '六盘水', '柳州', '陇南', '龙岩', '娄底', '陵水', '吕梁', '漯河', '洛阳', '泸州', '马鞍山', '茂名', '眉山', '梅州', '绵阳', '牡丹江', '南昌', '南充', '南京', '南宁', '南平', '南通', '南阳', '内江', '宁波', '宁德', '怒江', '盘锦', '攀枝花', '平顶山', '平凉', '萍乡', '普洱', '莆田', '濮阳', '黔东南', '潜江', '黔南', '黔西南', '青岛', '庆阳', '清远', '秦皇岛', '钦州', '琼海', '琼中', '齐齐哈尔', '七台河', '泉州', '曲靖', '衢州', '日喀则', '日照', '三门峡', '三明', '三亚', '上海', '商洛', '商丘', '上饶', '山南', '汕头', '汕尾', '韶关', '绍兴', '邵阳', '神农架林区', '沈阳', '深圳', '石河子', '石家庄', '十堰', '石嘴山', '双鸭山', '朔州', '四平', '松原', '绥化', '遂宁', '随州', '宿迁', '宿州', '苏州', '塔城', '泰安', '太原', '泰州', '台州', '唐山', '天津', '天门', '天水', '铁岭', '铜川', '通化', '通辽', '铜陵', '铜仁', '万宁', '潍坊', '威海', '渭南', '文昌', '文山', '温州', '乌海', '武汉', '芜湖', '五家渠', '乌兰察布', '乌鲁木齐', '武威', '无锡', '吴忠', '梧州', '厦门', '西安', '湘潭', '湘西', '襄阳', '咸宁', '仙桃', '咸阳', '孝感', '锡林郭勒', '兴安盟', '邢台', '兴义市', '西宁', '新乡', '信阳', '新余', '忻州', '西双版纳', '宣城', '许昌', '徐州', '雅安', '延安', '延边', '盐城', '阳江', '洋浦', '阳泉', '扬州', '烟台', '宜宾', '宜昌', '伊春', '宜春', '伊犁', '银川', '营口', '鹰潭', '宜兴市', '益阳', '永州', '岳阳', '玉林', '榆林', '运城', '云浮', '玉树', '玉溪', '枣庄', '张家界', '张家口', '张掖', '漳州', '湛江', '肇庆', '昭通', '郑州', '镇江', '中山', '中卫', '周口', '舟山', '珠海', '驻马店', '株洲', '淄博', '自贡', '资阳', '遵义']

image