jsonpath 模块对数据的操作记录

jsonpath 模块对数据的操作记录

json模块主要处理json数据

  1. 页面上爬取的数据,需要使用 loads() 方法将 json 对象转为字典
  2. 再通过下面的语法格式将需要的数据匹配出来
  3. jsonpath.jsonpath() 返回值是:列表

语法示例:

    import jsonpath

    s = '''
    { 
        "store": {
            "book": [ 
                { 
                    "category": "reference",
                    "author": "Nigel Rees",
                    "title": "Sayings of the Century",
                    "price": 8.95
                },
            ],
        "bicycle": {
        "color": "red",
        "price": 19.95
        }
    }
    }
    '''

    # 读取json, 即将json对象转换为字典类型
    s = json.loads(s)

    res = jsonpath.jsonpath(s,'此处输入匹配的语法规则')
    print(res)

语法说明

jsonpath的匹配语法 英文含义 中文含义
$ the root object/element 表示根元素或对象
@ the current object/element 表示当前元素或对象
. or [ ] child operator 表示子元素
.. recursive descent. JSONPath borrows this syntax from E4X. 递归匹配某元素下所有元素
* wildcard. All objects/elements regardless their names. 通配符,匹配当前元素下所有子对象和子元素。仅匹配一级
[ ] subscript operator. XPath uses it to iterate over element collections and for predicates. In Javascript and JSON it is the native array operator. 是匹配当前元素下的某个索引的元素,中括号中间的值为索引,起始值为0, 不可以使用 反向索引 。可以使用 * 表示所有的其下所有元素
[, ] Union operator in XPath results in a combination of node sets. JSONPath allows alternate names or array indices as a set. 中括号中的值为多个索引,使用逗号分隔。
[start: end: step] array slice operator borrowed from ES4. 使用索引切片匹配其中的值。[]、[,]、[indexValue1: indexvalue2: step]的语法可以参考列表的操作,注意索引从0开始。
?() applies a filter (script) expression. 过滤某些元素,?()的括号中间的值是元素名
() script expression, using the underlying script engine. 脚本表达式,使用底层脚本引擎。

语法代码示例

# 读取json, 即将json对象转换为字典类型
s = json.loads(s)


# 书点所有书的作者
res = jsonpath.jsonpath(s, '$.store.book..author')
print(res)
# 返回值:['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien']


# 所有的作者
res = jsonpath.jsonpath(s, '$..author')
print(res)
# 返回值:['Nigel Rees', 'Evelyn Waugh', 'Herman Melville', 'J. R. R. Tolkien', 'alice']


# store的所有元素。所有的book和bicycle
res = jsonpath.jsonpath(s, '$.store')
print(res)
# 返回值:[{'bicycle': {'author': 'alice', 'color': 'red', 'price': 19.95}, 'book': [{'author': 'Nigel Rees', 'title': 'Sayings of the Century', 'price': 8.95, 'category': 'reference'}, {'author': 'Evelyn Waugh', 'title': 'Sword of Honour', 'price': 12.99, 'category': 'fiction'}, {'author': 'Herman Melville', 'title': 'Moby Dick', 'isbn': '0-553-21311-3', 'price': 8.99, 'category': 'fiction'}, {'author': 'J. R. R. Tolkien', 'title': 'The Lord of the Rings', 'isbn': '0-395-19395-8', 'price': 22.99, 'category': 'fiction'}]}]


# store里面所有东西的price
res = jsonpath.jsonpath(s, '$..price')
print(res)
# 返回值:[19.95, 8.95, 12.99, 8.99, 22.99]

# 第三个书
res = jsonpath.jsonpath(s, '$.store.book[2]')
print(res)
# 返回值:[{'author': 'Herman Melville', 'isbn': '0-553-21311-3', 'category': 'fiction', 'title': 'Moby Dick', 'price': 8.99}]

# 最后一本书
res = jsonpath.jsonpath(s, '$.store.book[(@.length-1)]')
print(res)
# 返回值:[{'author': 'J. R. R. Tolkien', 'isbn': '0-395-19395-8', 'category': 'fiction', 'title': 'The Lord of the Rings', 'price': 22.99}]

# 前面的两本书。
# 方法一:
res = jsonpath.jsonpath(s, '$.store.book[0,1]')
print(res)
# 方法二:
res = jsonpath.jsonpath(s, '$.store.book[:2]')
print(res)
# 返回值:[{'author': 'Nigel Rees', 'category': 'reference', 'title': 'Sayings of the Century', 'price': 8.95}, {'author': 'Evelyn Waugh', 'category': 'fiction', 'title': 'Sword of Honour', 'price': 12.99}]


# 筛选出所有的包含isbn的书。
res = jsonpath.jsonpath(s, '$.store.book.?(@.isbn)')
print(res)
# 返回值:[{'price': 8.99, 'isbn': '0-553-21311-3', 'title': 'Moby Dick', 'category': 'fiction', 'author': 'Herman Melville'}, {'price': 22.99, 'isbn': '0-395-19395-8', 'title': 'The Lord of the Rings', 'category': 'fiction', 'author': 'J. R. R. Tolkien'}]


# 过滤出价格低于10的书。
res = jsonpath.jsonpath(s, '$.store.book.?(@.price<10)')
print(res)
# 返回值:[{'author': 'Nigel Rees', 'category': 'reference', 'price': 8.95, 'title': 'Sayings of the Century'}, {'author': 'Herman Melville', 'isbn': '0-553-21311-3', 'category': 'fiction', 'price': 8.99, 'title': 'Moby Dick'}]


# 所有元素。
res = jsonpath.jsonpath(s, '$..')
print(res)
# 返回值: [{'store': {'book': [{'price': 8.95, 'title': 'Sayings of the Century', 'author': 'Nigel Rees', 'category': 'reference'}, {'price': 12.99, 'title': 'Sword of Honour', 'author': 'Evelyn Waugh', 'category': 'fiction'}, {'price': 8.99, 'title': 'Moby Dick', 'author': 'Herman Melville', 'isbn': '0-553-21311-3', 'category': 'fiction'}, {'price': 22.99, 'title': 'The Lord of the Rings', 'author': 'J. R. R. Tolkien', 'isbn': '0-395-19395-8', 'category': 'fiction'}], 'bicycle': {'color': 'red', 'author': 'alice', 'price': 19.95}}}, {'book': [{'price': 8.95, 'title': 'Sayings of the Century', 'author': 'Nigel Rees', 'category': 'reference'}, {'price': 12.99, 'title': 'Sword of Honour', 'author': 'Evelyn Waugh', 'category': 'fiction'}, {'price': 8.99, 'title': 'Moby Dick', 'author': 'Herman Melville', 'isbn': '0-553-21311-3', 'category': 'fiction'}, {'price': 22.99, 'title': 'The Lord of the Rings', 'author': 'J. R. R. Tolkien', 'isbn': '0-395-19395-8', 'category': 'fiction'}], 'bicycle': {'color': 'red', 'author': 'alice', 'price': 19.95}}, [{'price': 8.95, 'title': 'Sayings of the Century', 'author': 'Nigel Rees', 'category': 'reference'}, {'price': 12.99, 'title': 'Sword of Honour', 'author': 'Evelyn Waugh', 'category': 'fiction'}, {'price': 8.99, 'title': 'Moby Dick', 'author': 'Herman Melville', 'isbn': '0-553-21311-3', 'category': 'fiction'}, {'price': 22.99, 'title': 'The Lord of the Rings', 'author': 'J. R. R. Tolkien', 'isbn': '0-395-19395-8', 'category': 'fiction'}], {'price': 8.95, 'title': 'Sayings of the Century', 'author': 'Nigel Rees', 'category': 'reference'}, 8.95, 'Sayings of the Century', 'Nigel Rees', 'reference', {'price': 12.99, 'title': 'Sword of Honour', 'author': 'Evelyn Waugh', 'category': 'fiction'}, 12.99, 'Sword of Honour', 'Evelyn Waugh', 'fiction', {'price': 8.99, 'title': 'Moby Dick', 'author': 'Herman Melville', 'isbn': '0-553-21311-3', 'category': 'fiction'}, 8.99, 'Moby Dick', 'Herman Melville', '0-553-21311-3', 'fiction', {'price': 22.99, 'title': 'The Lord of the Rings', 'author': 'J. R. R. Tolkien', 'isbn': '0-395-19395-8', 'category': 'fiction'}, 22.99, 'The Lord of the Rings', 'J. R. R. Tolkien', '0-395-19395-8', 'fiction', {'color': 'red', 'author': 'alice', 'price': 19.95}, 'red', 'alice', 19.95]
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 205,033评论 6 478
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 87,725评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 151,473评论 0 338
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,846评论 1 277
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,848评论 5 368
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,691评论 1 282
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 38,053评论 3 399
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,700评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 42,856评论 1 300
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,676评论 2 323
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,787评论 1 333
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,430评论 4 321
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 39,034评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,990评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,218评论 1 260
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 45,174评论 2 352
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,526评论 2 343

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,598评论 18 139
  • 发现 关注 消息 iOS 第三方库、插件、知名博客总结 作者大灰狼的小绵羊哥哥关注 2017.06.26 09:4...
    肇东周阅读 12,019评论 4 62
  • 〇、前言 本文共108张图,流量党请慎重! 历时1个半月,我把自己学习Python基础知识的框架详细梳理了一遍。 ...
    Raxxie阅读 18,915评论 17 410
  • 这是韩国女团在录制视频时留下的一段视频,咱们中国是留有五千年历史文化的古国,思想一直都是比较保守的,看到这张图片让...
    微笑掩饰所有悲伤_29b1阅读 590评论 0 0
  • ‌看过很多的心灵鸡汤,读过很多的书,今天才明白什么是“你的才华还撑不起你的梦想” ‌我做不到,做一件事的时候可以不...
    早已不年少阅读 272评论 0 3