大家好, 我是 Python 进阶者.
前言
前几天在才哥的交流群有个叫 [杭州 - 学生 - 飞飞飞] 的粉丝在群里问了一个 JSON 文件处理的问题.
看上去他只需要 follower 和 ddate 这两个字段下的对应的值.
我们知道 JSON 是一种常见的数据传输形式, 所以对于爬取数据的数据解析, JSON 的相关操作是比较重要的, 能够加快我们的数据提取效率.
思路
关于这个问题, 倒不是很难, 群里提出了三个方法, 第一个是才哥说的 pd 处理或者正则表达式, 第二个是小编自己提出的 JSON 处理, 第三个是 [成都 - IT 技术支持 - 小王] 提出的 jsonpath, 总之方法很多, 这里给出 4 个处理方法, 希望下次粉丝们再遇到类似问题的时候, 有章可循.
实现过程
1, 正则表达式
这个方法可以看看, 通过匹配的方法进行提取, 代码如下所示:
- import re
- import JSON
- file = open('漫画. txt', 'r', encoding='utf-8')
- content = file.readline()
- ddate_result1 = re.findall('"ddate":"(\d+\-\d+\-\d+)"', content)
- ddate_result2 = re.findall('"ddate":"(.*?)"', content)
- follower_result1 = re.findall('"follower":(\d+),"', content)
- print(ddate_result1)
- print(ddate_result2)
- print(follower_result1)
运行之后, 可以得到结果:
关于 ddate,follower 获取的方法肯定还有很多其他写法, 这里只是抛砖引玉, 欢迎大家多多尝试.
2,jsonpath 方法一
关于 jsonpath 的用法, 之前在这篇文章中有提及, 感兴趣的小伙伴也可以去看看: 数据提取之 JSON 与 JsonPATH.
下面是 [成都 - IT 技术支持 - 小王] 大佬给的代码:
- from jsonpath import jsonpath
- import JSON
- """follower 和 ddate"""
- with open("漫画. txt", encoding="utf-8") as file:
- file_json = JSON.loads(file.readline())
- follower = jsonpath(file_json, "$..follower")
- ddate = jsonpath(file_json, "$..ddate")
- print(follower)
- print(ddate)
代码运行之后, 就会得到想要的数据, 如下图所示:
这个.. 就和 xpath 里面的 // 一样, 子孙节点,$ 是根节点.
3,jsonpath 方法二
这个是另外一个用法了, 小号 [皮皮] 提供的, 直接上代码.
- import JSON
- import jsonpath
- # obj = JSON.load(open('罗翔. json', 'r', encoding='utf-8')) # 注意, 这里是文件的形式, 不能直接放一个文件名的字符串
- file = open('漫画. txt', 'r', encoding='utf-8') # 注意, 这里是文件的形式, 不能直接放一个文件名的字符串
- obj = JSON.loads(file.readline())
- follower = jsonpath.jsonpath(obj, '$..follower') # 文件对象 jsonpath 语法
- ddate = jsonpath.jsonpath(obj, '$..ddate') # 文件对象 jsonpath 语法
- print(follower)
- print(ddate)
代码运行之后, 也可以得到预期的结果.
当然了, 如果你的文件本来就是 JSON 文件, 也可以直接读取, 代码类似:
- import JSON
- import jsonpath
- obj = JSON.load(open('罗翔. json', 'r', encoding='utf-8')) # 注意, 这里是文件的形式, 不能直接放一个文件名的字符串
- # file = open('罗翔. json', 'r', encoding='utf-8') # 注意, 这里是文件的形式, 不能直接放一个文件名的字符串
- # obj = JSON.loads(file.readline())
- follower = jsonpath.jsonpath(obj, '$..follower') # 文件对象 jsonpath 语法
- ddate = jsonpath.jsonpath(obj, '$..ddate') # 文件对象 jsonpath 语法
- print(follower)
- print(ddate)
运行之后, 也可以得到预期的结果:
4,jsonpath 方法三
这个是群里 [深圳 - Hua Bro] 华博提供的, 代码如下:
- import JSON
- import jsonpath
- with open("罗翔. txt", 'r', encoding="UTF-8") as fr:
- file_json = eval(fr.read().replace('\n\u200b', '')) # 读取的 str 转为字典
- follower = jsonpath.jsonpath(file_json, '$..follower') # 文件对象 jsonpath 语法
- ddate = jsonpath.jsonpath(file_json, '$..ddate') # 文件对象 jsonpath 语法
- print(follower)
- print(ddate)
方法大同小异, 运行之后, 也可以拿到预取的目标数据, 如下图所示.
总结
我是 Python 进阶者. 本文基于粉丝针对 JSON 文件处理的提问, 综合群友们的回答, 整理了 4 种可行的方案, 帮助粉丝解决了问题. 这里墙裂给大家推荐 jsonpath 这个库, 感兴趣的小伙伴可以学习学习, 下次再遇到 JSON 文件提取数据就再也不慌啦!
来源: http://developer.51cto.com/art/202112/693554.htm