Json解析 |
印象中,json都长得很乖巧,一个属性对应一个值,key-value
,某天你的leader让你去爬数据,你爬到了这样的数据:
var hei ha {‘error’: 0, ‘errorMsg’: ‘SUCCESS’, uptime: ‘20180105121318000’, ‘preClose’: 33.459999084473, tick: [{‘date’: ‘20180105’, ‘time’: 113002000, ‘price’: 33.990001678467, ‘volume’: 37100, ‘bsflag’: “B”, “ccl”: 0}…]};
既有单引号又有双引号,且单引号在属性和值之间交叉,怎么搞?replace?sub?再一看一个词包含另一个词,如,uptime与time,error与errorMsg,再替换?还有很多呢?心态要崩。。。。
这就崩了?实际的爬虫中很多大网站都是这样的json串,如,百度,新浪等。
不怕,总会有人帮我们写好工具的[奸诈笑],只需import就好了,实在满足不了个性化需求就改改源码。。。
- 以下将介绍解析json的四个库;
- 完整示例代码:完整示例下载;
- 环境:
- OS:win10;
- Python:3.6;
一、内置json模块 |
♣ 内置json的简介
- 如果你是用Anaconda环境,会自带json模块。
- 自带的json模块对json数据的格式要求比较严格,要求:
- 必须出入str字段;
- 属性必须使用双引号
""
括起来,如,{["key": value, "a": b]}
。
♣ json模块的使用
示例1.1
使用标准数据格式。
import json
str1 = 'jQuery180({"errorNo": 0, "errorMsg": "SUCCESS", "latestTimelineStamp": "20180105121318000", "preClose": 33.459999084473, "tick": [{"date": 20180105, "time": 113002000, "price": 33.990001678467, "volume": 37100, "bsflag": "B", "ccl": 0}]});'
# 去除两边的无用数据
json_str1 = str1.strip("jQuery180();")
# 解析json字符串
json_data1 = json.loads(json_str1)
print("解析后的json数据:\n", json_data1)
print("取json数据:\n", json_data1['tick'])
运行结果:
解析后的json数据:
{'errorNo': 0, 'errorMsg': 'SUCCESS', 'latestTimelineStamp': '20180105121318000', 'preClose': 33.459999084473, 'tick': [{'date': 20180105, 'time': 113002000, 'price': 33.990001678467, 'volume': 37100, 'bsflag': 'B', 'ccl': 0}]}
取json数据:
[{'date': 20180105, 'time': 113002000, 'price': 33.990001678467, 'volume': 37100, 'bsflag': 'B', 'ccl': 0}]
示例1.2
当数据中出现单引号时。
import json
str1 = "{'errorNo': 0, 'errorMsg': 'SUCCESS', 'latestTimelineStamp': '20180105121318000', 'preClose': 33.459999084473, 'tick': [{'date': 20180105}]}"
# 解析json字符串
json_data1 = json.loads(str1)
print("解析后的json数据:\n", json_data1)
print("取json数据:\n",