Python:数据提取之JSON与JsonPATH
JSON(JavaScript Object Notation) 是一种轻量级的数据交换格式 它使得人们很容易的进行阅读和编写。同时也方便了机器进行解析和生成。适用于进行数据交互的场景 比如网站前台与后台之间的数据交互。
JSON和XML的比较可谓不相上下。
Python 2.7中自带了JSON模块 直接import json就可以使用了。
官方文档 http://docs.python.org/library/json.html
Json在线解析网站 http://www.json.cn/#
json简单说就是javascript中的对象和数组 所以这两种结构就是对象和数组两种结构 通过这两种结构可以表示各种复杂的结构
对象 对象在js中表示为{ }括起来的内容 数据结构为 { key value, key value, ... }的键值对的结构 在面向对象的语言中 key为对象的属性 value为对应的属性值 所以很容易理解 取值方法为 对象.key 获取属性值 这个属性值的类型可以是数字、字符串、数组、对象这几种。
数组 数组在js中是中括号[ ]括起来的内容 数据结构为 [ Python , javascript , C , ...] 取值方式和所有语言中一样 使用索引获取 字段值的类型可以是 数字、字符串、数组、对象几种。
json模块提供了四个功能 dumps、dump、loads、load 用于字符串 和 python数据类型间进行转换。
把Json格式字符串解码转换成Python对象 从json到python的类型转化对照如下
# json_loads.py import json strList [1, 2, 3, 4] strDict { city : 北京 , name : 大猫 } json.loads(strList) # [1, 2, 3, 4] json.loads(strDict) # json数据自动按Unicode存储 # {u city : u \u5317\u4eac , u name : u \u5927\u732b }
实现python类型转化为json字符串 返回一个str对象 把一个Python对象编码转换成Json字符串
从python原始类型向json类型的转化对照如下
# json_dumps.py import json import chardet listStr [1, 2, 3, 4] tupleStr (1, 2, 3, 4) dictStr { city : 北京 , name : 大猫 } json.dumps(listStr) # [1, 2, 3, 4] json.dumps(tupleStr) # [1, 2, 3, 4] # 注意 json.dumps() 序列化时默认使用的ascii编码 # 添加参数 ensure_ascii False 禁用ascii编码 按utf-8编码 # chardet.detect()返回字典, 其中confidence是检测精确度 json.dumps(dictStr) # { city : \\u5317\\u4eac , name : \\u5927\\u5218 } chardet.detect(json.dumps(dictStr)) # { confidence : 1.0, encoding : ascii } print json.dumps(dictStr, ensure_ascii False) # { city : 北京 , name : 大刘 } chardet.detect(json.dumps(dictStr, ensure_ascii False)) # { confidence : 0.99, encoding : utf-8 }
chardet是一个非常优秀的编码识别模块 可通过pip安装
将Python内置类型序列化为json对象后写入文件
# json_dump.py import json listStr [{ city : 北京 }, { name : 大刘 }] json.dump(listStr, open( listStr.json , w ), ensure_ascii False) dictStr { city : 北京 , name : 大刘 } json.dump(dictStr, open( dictStr.json , w ), ensure_ascii False) 4. json.load() 读取文件中json形式的字符串元素 转化成python类型 # json_load.py import json strList json.load(open( listStr.json )) print strList # [{u city : u \u5317\u4eac }, {u name : u \u5927\u5218 }] strDict json.load(open( dictStr.json )) print strDict # {u city : u \u5317\u4eac , u name : u \u5927\u5218 }
JsonPath 是一种信息抽取类库 是从JSON文档中抽取指定信息的工具 提供多种语言实现版本 包括 Javascript, Python PHP 和 Java。
JsonPath 对于 JSON 来说 相当于 XPATH 对于 XML。
下载地址 https://pypi.python.org/pypi/jsonpath
安装方法 点击Download URL链接下载jsonpath 解压之后执行python setup.py install
官方文档 http://goessner.net/articles/JsonPath
Json结构清晰 可读性高 复杂度低 非常容易匹配 下表中对应了XPath的用法。
我们以拉勾网城市JSON文件 http://www.lagou.com/lbs/getAllCitySearchLabels.json 为例 获取所有城市。
# jsonpath_lagou.py import urllib2 import jsonpath import json import chardet url http://www.lagou.com/lbs/getAllCitySearchLabels.json request urllib2.Request(url) response urllib2.urlopen(request) html response.read() # 把json格式字符串转换成python对象 jsonobj json.loads(html) # 从根节点开始 匹配name节点 citylist jsonpath.jsonpath(jsonobj, $..name ) print citylist print type(citylist) fp open( city.json , w ) content json.dumps(citylist, ensure_ascii False) print content fp.write(content.encode( utf-8 )) fp.close()
json.loads() 是把 Json格式字符串解码转换成Python对象 如果在json.loads的时候出错 要注意被解码的Json字符的编码。
如果传入的字符串的编码不是UTF-8的话 需要指定字符编码的参数 encoding
dataDict json.loads(jsonStrGBK);
dataJsonStr是JSON字符串 假设其编码本身是非UTF-8的话而是GBK 的 那么上述代码会导致出错 改为对应的
dataDict json.loads(jsonStrGBK, encoding GBK
如果 dataJsonStr通过encoding指定了合适的编码 但是其中又包含了其他编码的字符 则需要先去将dataJsonStr转换为Unicode 然后再指定编码格式调用json.loads()
python dataJsonStrUni dataJsonStr.decode( GB2312 dataDict json.loads(dataJsonStrUni, encoding GB2312
##字符串编码转换
这是中国程序员最苦逼的地方 什么乱码之类的几乎都是由汉字引起的。
其实编码问题很好搞定 只要记住一点
####任何平台的任何编码 都能和 Unicode 互相转换
UTF-8 与 GBK 互相转换 那就先把UTF-8转换成Unicode 再从Unicode转换成GBK 反之同理。
python # 这是一个 UTF-8 编码的字符串 utf8Str 你好地球 # 1. 将 UTF-8 编码的字符串 转换成 Unicode 编码 unicodeStr utf8Str.decode( UTF-8 ) # 2. 再将 Unicode 编码格式字符串 转换成 GBK 编码 gbkData unicodeStr.encode( GBK ) # 1. 再将 GBK 编码格式字符串 转化成 Unicode unicodeStr gbkData.decode( gbk ) # 2. 再将 Unicode 编码格式字符串转换成 UTF-8 utf8Str unicodeStr.encode( UTF-8 )
decode的作用是将其他编码的字符串转换成 Unicode 编码
encode的作用是将 Unicode 编码转换成其他编码的字符串
一句话 UTF-8是对Unicode字符集进行编码的一种编码方式
如何使用Python对嵌套结构的JSON进行遍历获取链接并下载文件 JSON(JavaScript Object Notation)是一种基于JavaScript语言的轻量级数据交换格式,它用键值对的方式来表示各种数据类型,包括字符串、数字、布尔值、空值、数组和对象,本文展示如何使用Python对嵌套结构的JSON进行遍历获取链接并下载文件。
Lansonli CSDN大数据领域博客专家,华为云享专家、阿里云专家博主、腾云先锋(TDP)核心成员、51CTO专家博主,全网六万多粉丝,知名互联网公司大数据高级开发工程师
相关文章
- Python数据可视化 | 一文带你掌握Pyecharts地理数据可视化
- python redirect重定向使用方法
- 【Python开发】Python中的class继承
- Python数据序列化:①对象序列化 pickle【pickle.dump()、pickle.load()】、②文本序列化 json【json.dump()、json.load()】、③shelve
- Python:sklearn数据预处理中fit(),transform()与fit_transform()的区别
- 4.Python中pandas对数据的操作
- 零基础入门Python之安装Anaconda
- Python数据科学指南
- 【大数据&AI人工智能】《Python数据科学手册》笔记
- 数据科学中R VS Python:获胜者是...
- 一文看懂Python及Django不同类型数据的json序列化
- Python第三方模块:PyQt5简介
- Python time 模块
- Python 代理爬取网站数据
- Python基本语法_强制数据类型转换
- 十六、python学习之MySQL数据库(三):数据查询操作
- python学习之美多商城(九):用户模块--用户中心个人信息、邮件验证、celery异步实现发送邮件