Python使用jsonpath-rw模块处理Json对象操作示例
本文介绍在Python爬虫开发中,如何利用jsonpath-rw模块高效提取JSON数据。文章对比了传统字典取值方式的局限性,演示了从requests或scrapy获取响应后转换为JSON对象的过程,并通过具体代码示例展示了jsonpath-rw的基本用法及值提取技巧,帮助开发者更灵活地处理复杂JSON结构。
本文通过具体实例,详细讲解在Python中利用jsonpath-rw模块处理JSON对象的方法,供读者参考学习。
近期在进行爬虫开发时,需要从网站返回的JSON格式数据中提取关键信息。
向指定URL发起请求后,获取到的response对象在Python3环境下,其response.content属性返回的是二进制bytes类型数据,必须调用decode()方法将其转换为unicode类型的字符串,才能进一步处理。
#如果用的requests发的请求 import json response = requests.get(url,headers=self.headers) response = response.content.decode() response = json.loads(response) #转成json对象,在python里也就是dict类型
#如果用的scrapy.Request发的请求 import json import scrapy response = scrapy.Request(url,headers=self.headers) response = response.text.decode() response = json.loads(response) #转成json对象,在python里也就是dict类型
这意味着处理JSON对象本质上等同于处理字典(dict)。虽然可行,但需要频繁使用中括号进行索引,且只能获取精确匹配的单个值,操作方式显得不够灵活。
对于熟悉XPath或CSS选择器的开发者而言,这种传统的取值方式显得较为笨重。
幸运的是,JSON数据同样拥有类似的选择器机制:jsonpath。
需要注意的是,Python生态中直接可用的库并非名为jsonpath(尽管存在该名称的库,但缺乏官方Python使用文档且难以直接使用),真正在Python中广泛使用的库是jsonpath-rw。
官方文档地址:https://pypi.python.org/pypi/jsonpath-rw (如需了解更多jsonpath语法,请点击链接查看)。
下文仅列举该库简单且常用的基本使用方法。
具体使用示例如下。
>>> from jsonpath_rw import jsonpath, parse
>>> json_obj = {"student":[{"male":176,"female":162},{"male":174,"female":159}]}
>>> jsonpath_expr = parse("student[*].male")
>>> male = jsonpath_expr.find(json_obj)
>>> male #返回的是list,但是不是我们想要的值
[DatumInContext(value=176, path=Fields('male'), context=DatumInContext(value={'male': 176, 'female': 162}, path=<jsonpath_rw.jsonpath.Index object at 0x000001C6B95109B0>, context=DatumInContext(value=[{'male': 176, 'female': 162}, {'male': 174, 'female': 159}], path=Fields('student'), context=DatumInContext(value={'student': [{'male': 176, 'female': 162}, {'male': 174, 'female': 159}]}, path=This(), context=None)))), DatumInContext(value=174, path=Fields('male'), context=DatumInContext(value={'male': 174, 'female': 159}, path=<jsonpath_rw.jsonpath.Index object at 0x000001C6B9510588>, context=DatumInContext(value=[{'male': 176, 'female': 162}, {'male': 174, 'female': 159}], path=Fields('student'), context=DatumInContext(value={'student': [{'male': 176, 'female': 162}, {'male': 174, 'female': 159}]}, path=This(), context=None))))]
#想要获取值,要用如下方法
>>> [match.value for match in male]
[176, 174]
此外,推荐几款实用的JSON在线工具供参考:
在线JSON代码检验、格式化与美化工具: http://tools.jb51.net/code/json
JSON在线格式化工具: http://tools.jb51.net/code/jsonformat
在线XML与JSON互转工具: http://tools.jb51.net/code/xmljson
JSON代码在线格式化、美化、压缩、编辑及转换工具: http://tools.jb51.net/code/jsoncodeformat
在线JSON压缩与转义工具: http://tools.jb51.net/code/json_yasuo_trans
对Python其他内容感兴趣的读者,可进一步查阅本站专题:《Python操作json技巧总结》、《Python编码操作技巧总结》、《Python数据结构与算法教程》、《Python函数使用技巧总结》、《Python字符串操作技巧汇总》、《Python入门与进阶经典教程》以及《Python文件与目录操作技巧汇总》。
希望本文所述内容能对大家的Python编程实践有所帮助。
免责声明:本文内容仅供参考,不代表本站观点。转载或引用请注明出处。









