Python使用jsonpath-rw模块处理Json对象操作示例
本文实例讲述了Python使用jsonpath-rw模块处理Json对象操作。分享给大家供大家参考,具体如下:
这两天在写一个爬虫,需要从网站返回的json数据提取一些有用的数据。
向url发起请求,返回的是response,在python3中,response.content是二进制bytes类型的,需要用decode()转成unicode的str类型
#如果用的requests发的请求 importjson response=requests.get(url,headers=self.headers) response=response.content.decode() response=json.loads(response)#转成json对象,在python里也就是dict类型
#如果用的scrapy.Request发的请求 importjson importscrapy 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的语法请点击链接)
下面只列下简单常用的基本方法
使用示例
>>>fromjsonpath_rwimportjsonpath,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=,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= ,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.valueformatchinmale] [176,174]
PS:这里再为大家推荐几款比较实用的json在线工具供大家参考使用:
在线
JSON在线格式化工具:
http://tools.jb51.net/code/jsonformat
在线XML/