查看原文
其他

Json文件好帮手——JsonPath

爬虫俱乐部 Stata and Python数据分析 2022-03-15

本文作者:戴   雯,中南财经政法大学金融学院

本文编辑:石   艳

技术总编:张馨月

爬虫俱乐部云端课程

  爬虫俱乐部于2020年暑期在线上举办的Stata与Python编程技术训练营和Stata数据分析法律与制度专题训练营已经圆满结束啦~应广大学员需求,我们的课程现已在腾讯课堂全面上线,且继续提供答疑服务。现在关注公众号并在朋友圈转发推文《来腾讯课堂学Stata和Python啦》或《8月Stata数据分析法律与制度专场来啦!》,即可获得600元课程优惠券,集赞50个再领200元课程优惠券!(截图发至本公众号后台领取)原价2400元的课程,现在只要1600元
在推文《【爬虫实战】喜茶的门店都开在了哪里?》中,我们用JsonPath对相关内容进行了提取,那么这个json提取利器具体如何使用呢?今天小编将带领大家详细了解JsonPath,一起往下看吧~
一、什么是Json
在介绍JsonPath之前,我们先来看一看什么是Json呢?Json (JavaScript Object Notation, JS 对象简谱) 是一种轻量级的数据交换格式。它将数据以键值对和数值列表的形式有序存储,这种数据形式易于人们阅读和编写,也易于电脑解析和生成,有效地提升了网络传输效率。
下面是关于深交所信息披露考评的Json文档:

从形式上看这是由字典组成的列表,可以看出每个字典里面都是4个键值对,整个列表里有20个字典,对应表格里的20行,每个字典对应的都是一行,网页中的显示效果如下:

二、JsonPath介绍

对于上面这个多层嵌套的复杂字典,想要批量提取是比较困难的。JsonPath模块就能解决这个痛点,它可以按照key对Python字典进行批量数据提取。
①JsonPath是一个第三方模块,首先需要通过 pip install jsonpath进行安装。
②JsonPath模块提取数据的方法:
1import jsonpath
2result = jsonpath(a,'jsonpath语法规则字符串')

JsonPath的语法规则:

JsonPath描述
$根节点
@当前节点
. or []取子节点
..深层扫描,不管位置,选择所有符合条件的条件
*通配符,匹配所有的元素节点
?()支持过滤操作
()支持表达式计算

下面举一个简单的小栗子,一起看看JsonPath究竟是如何提取信息的吧~这是一份有关商店里商品信息的Json文档,主要包括书籍book和自行车bicycle两类商品,通过应用JsonPath这个模块,可以提取到我们想要的特定信息。

1import jsonpath
2book_dict = { 
3  "store": {
4    "book": [ 
5      { "category""reference",
6        "author""Nigel Rees",
7        "title""Sayings of the Century",
8        "price"8.95
9      },
10      { "category""fiction",
11        "author""Evelyn Waugh",
12        "title""Sword of Honour",
13        "price"12.99
14      },
15      { "category""fiction",
16        "author""Herman Melville",
17        "title""Moby Dick",
18        "isbn""0-553-21311-3",
19        "price"8.99
20      },
21      { "category""fiction",
22        "author""J. R. R. Tolkien",
23        "title""The Lord of the Rings",
24        "isbn""0-395-19395-8",
25        "price"22.99
26      }
27    ],
28    "bicycle": {
29      "color""red",
30      "price"19.95
31    }
32  }
33}

接下来,我们可以结合上面所说的JsonPath语法规则,尝试提取不同内容。值得注意的是,$..这种字符语法规则表示从任意位置提取,这是我们在提取Json文档时最最常用的一种哦~。

如果想提取store下的所有元素,可以输入如下代码,结果如下:

1jsonpath(book_dict,'$..store'# $..store表示从任意位置提取商店信息


如果想提取author下的所有元素,可以输入如下代码,结果如下:
1print(jsonpath(book_dict,'$..author')) # $..author表示从任意位置提取作者信息


同时,JsonPath也支持根据索引值来提取元素,结果如下:
1print(jsonpath(book_dict,'$..book[2]')) #提取book中的第三个元素,即第三本书对应的信息
2print(jsonpath(book_dict,'$..book[(@.length-1)]')) #提取book中最后一本书的信息
3print(jsonpath(book_dict,'$..book[0,1]')) #提取book中前两本书的信息


此外,我们还可以根据特定规则来筛选所需元素,结果如下:
1print(jsonpath(book_dict,'$..book[?(@.isbn)]')) #使用?()过滤有isbn编号的所有书籍
2print(jsonpath(book_dict,'$..book[?(@.price<10)]')) #使用?()过滤价格低于10元的所有书籍


三、实战演练

通过上面的介绍,我们已经了解了JsonPath的基本语法规则。那在日常的数据处理中,JsonPath是如何运用的呢?这里以大连商品交易所农产品期货价格指数的抓取为例进行展示。(http://www.dce.com.cn/dalianshangpin/sspz/qhzs/index.html?indexCode=pfm001)

由于网页中只以k线图的形式展示了指数变化趋势,需要先找到储存这些信息的真实链接,打开开发者工具,我们最终可以看到这些信息以json格式储存在网页中:

通过观察可以看到,日期、开盘价、收盘价和结算价分别储存在"tradeDate" "openPrice" "closePrice" "clearPrice"下,因此我们可以使用$..+节点名称来提取信息,其中$代表查询根元素,..代表深层扫描,代码如下:
1import jsonpath
2import requests
3import pandas as pd
4url = "http://index.dce.com.cn:10000/dce-webapp-indexquote-1.0-RELEASE/indexQuote/kLine?indexCode=pfm001&type=0&v=013303227965216968"
5html = requests.get(url) #, headers = headers
6null = ''
7page = eval(html.text)
8date=jsonpath.jsonpath(page['data'], "$..tradeDate"
9openprice=jsonpath.jsonpath(page['data'], "$..openPrice"
10closeprice=jsonpath.jsonpath(page['data'], "$..closePrice"
11clearprice=jsonpath.jsonpath(page['data'], "$..clearPrice"
12data2 = {'date': date,
13        'close': closeprice,
14        'open': openprice,
15        'clear': clearprice}
16data = pd.DataFrame(data2)
17data

最终得到的结果如下:

以上就是本期推文的全部内容了,对于“深藏不露”的Json文档,JsonPath是你征服它的一把神器,喜欢的小伙伴别忘了转发一波哦,泥萌的支持是小编努力码字的最大动力~




对我们的推文累计打赏超过1000元,我们即可给您开具发票,发票类别为“咨询费”。用心做事,不负您的支持!
往期推文推荐数据转置pro之sxpose2文件"搬家"小助手:mvfiles

pyecharts绘图——河流图展示

你知道MDPI期刊的热门题目吗?

文件合并你不行,mergemany来帮宁

         分组进行描述性统计的小技巧 --astx命令介绍

新年快乐|爬虫俱乐部2020年度总结

不能忘却的记忆| B站弹幕爬虫

Python中实现Excel的重复值提取fileexists:告诉你“我”存在吗?

工作中一切困难的解决途径——motivatedolly

【爬虫实战】喜茶的门店都开在了哪里?

import delimited | 再也不用担心读入网页源代码“乱七芭蕉”了

如何简洁地列出指定属性的变量?ds命令来了!

如何在Python中进行描述性统计分析?

分析师和他们的雇主重视与管理层接触吗?——分析师参与盈余电话会议的研究

繁忙的董事与公司业绩:来自并购的证据使用Python接口读取CSMAR数据列表生成式|让你的代码简洁又美观Stata中变量观测值的亲密伙伴——levelsof命令
关于我们


微信公众号“Stata and Python数据分析”分享实用的stata、python等软件的数据处理知识,欢迎转载、打赏。我们是由李春涛教授领导下的研究生及本科生组成的大数据处理和分析团队。

此外,欢迎大家踊跃投稿,介绍一些关于stata和python的数据处理和分析技巧。投稿邮箱:statatraining@163.com投稿要求:
1)必须原创,禁止抄袭;
2)必须准确,详细,有例子,有截图;
注意事项:
1)所有投稿都会经过本公众号运营团队成员的审核,审核通过才可录用,一经录用,会在该推文里为作者署名,并有赏金分成。
2)邮件请注明投稿,邮件名称为“投稿+推文名称”。
3)应广大读者要求,现开通有偿问答服务,如果大家遇到有关数据处理、分析等问题,可以在公众号中提出,只需支付少量赏金,我们会在后期的推文里给予解答。

您可能也对以下帖子感兴趣

文章有问题?点此查看未经处理的缓存