一、json模块的介绍
json模块是Python自带的模块,用于json和Python数据之间的相互转换
Json与Python数据类型的对应关系
Json | Python |
---|---|
object | dict |
array | list |
string | str |
number(int) | int,long |
number(real) | float |
true | True |
false | False |
null | None |
[#中括号括起来的,对应与Json中的array数组,在python中为list列表{#大括号括起来的,对应于Json中的object对象,在python中为dict字典"beyond":"yanyu"#beyond在Json中为对象的属性,在python为字典的键;yanyu在Json中为属性的值,在python为字典的值},{"age":22#当然字符串string--str;number(int)--int、long}
]
二、JSON转换为Python
1,把JSON字符串转为Python数据
import jsonjson_str = '''[{"name":"huangjiaju","age":"43","band":"beyond"}]'''#准备JSON字符串rs = json.loads(json_str)#转换为Python数据
print(rs)#结果为:[{'name': 'huangjiaju', 'age': '43', 'band': 'beyond'}]print(type(rs))#结果为:<class 'list'>
print(type(rs[0]))#结果为:<class 'dict'>
2,把JSON格式的文件转为Python类型的数据
json.json
[{"name":"huangjiaju","age":"43","band":"beyond"}
]
import jsonwith open("E:\Jupyter_workspace\study\python\爬虫\json.json") as fp:python_list = json.load(fp)print(python_list)#结果为:[{'name': 'huangjiaju', 'age': '43', 'band': 'beyond'}]print(type(python_list))#结果为:<class 'list'>print(type(python_list[0]))#结果为:<class 'dict'>
三、Python转换为JSON
1,把Python类型数据转为JSON字符串
import jsonpython_str = '''[{"name":"huangjiaju","age":"43","band":"beyond"}]'''#准备Python数据
rs = json.loads(python_str)
json_str = json.dumps(rs,ensure_ascii=False)#转换为JSON字符串 第二个参数表示是否使用ASCII码,默认为True,若有汉字则需要设置为False
print(json_str)#结果为:[{"name": "huangjiaju", "age": "43", "band": "beyond"}]
2,把Python类型数据以JSON格式存储到文件中
import jsonpython_str = '''[{"name":"huangjiaju","age":"43","band":"beyond"}]'''#准备Python字符串
rs = json.loads(python_str)with open("E:\Jupyter_workspace\study\python\爬虫\json1.json",'w') as fp:json.dump(rs,fp,ensure_ascii=False)#转换为JSON字符串 第二个参数表示是否使用ASCII码,默认为True,若有汉字则需要设置为False
最终效果为生成json1.json,成功的把Python类型数据以JSON格式存储到文件中。
json1.json内容如下:
四、解析最新的疫情数据的json字符串
步骤:
- 发送请求,获取疫情首页
- 从疫情首页中提取各国疫情字符串
- 从各国疫情字符串中,提取json格式字符串
- 把json格式字符串转换为Python数据类型
当然,数据来源仍然是丁香园新型冠状病毒肺炎疫情实时动态首页
url:https://ncov.dxy.cn/ncovh5/view/pneumonia
# 1,导入相关模块
import requests
import re
import json
from bs4 import BeautifulSoup# 2,发送请求,获取疫情首页内容
response = requests.get('https://ncov.dxy.cn/ncovh5/view/pneumonia')
home_page = response.content.decode()
#print(home_page)
# 3,使用Beautiful Soup提取疫情数据
soup = BeautifulSoup(home_page,'lxml')
script = soup.find(id='getAreaStat')
text = script.text
#print(text)# 4,使用正则表达式提取json字符串
json_str = re.findall(r'\[.+\]',text)[0]#由于中括号是个特殊的字符,需要在前面加个转义符;最后的结果会存在列表中,故使用[0]来获取完整json格式
#print(json_str)# 5,把json字符串转换为Python类型的数据
last_day_HongKong_num = json.loads(json_str)
print(last_day_HongKong_num)
'''
[{'provinceName': '香港', 'provinceShortName': '香港', 'currentConfirmedCount': 5990, 'confirmedCount': 22468, 'suspectedCount': 181, 'curedCount': 16190, 'deadCount': 288, 'comment': '疑似 1 例', 'locationId': 810000, 'statisticsData': 'https://file1.dxycdn.com/2020/0223/331/3398299755968040033-135.json', 'highDangerCount': 0, 'midDangerCount': 0, 'detectOrgCount': 0, 'vaccinationOrgCount': 0, 'cities': [], 'dangerAreas': []}, {'provinceName': '台湾', 'provinceShortName': '台湾', 'currentConfirmedCount': 5462, 'confirmedCount': 20056, 'suspectedCount': 485, 'curedCount': 13742, 'deadCount': 852, 'comment': '', 'locationId': 710000, 'statisticsData': 'https://file1.dxycdn.com/2020/0223/045/3398299749526003760-135.json', 'highDangerCount': 0, 'midDangerCount': 0, 'detectOrgCount': 0, 'vaccinationOrgCount': 0, 'cities': [], 'dangerAreas': []}, {'provinceName': '浙江省', 'provinceShortName': '浙江', 'currentConfirmedCount': 388, 'confirmedCount': 2255, 'suspectedCount': 68, 'curedCount': 1866, 'deadCount': 1, 'comment': '2月10日通报核减的12例在浙江省治愈的外省病例,根据国家最新要求重新纳入累计病例。', 'locationId': 330000, 'statisticsData': 'https://file1.dxycdn.com/2020/0223/537/3398299755968455045-135.json', 'highDangerCount': 0, 'midDangerCount': 0, 'detectOrgCount': 519, 'vaccinationOrgCount': 217, 'cities': [{'cityName': '杭州', 'currentConfirmedCount': 143, 'confirmedCount': 328, 'suspectedCount': 0, 'curedCount': 185, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 330100, 'currentConfirmedCountStr': '143'}, {'cityName': '境外输入', 'currentConfirmedCount': 119, 'confirmedCount': 387, 'suspectedCount': 68, 'curedCount': 268, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 0, 'currentConfirmedCountStr': '119'}, {'cityName': '宁波', 'currentConfirmedCount': 110, 'confirmedCount': 269, 'suspectedCount': 0, 'curedCount': 159, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 330200, 'currentConfirmedCountStr': '110'}, {'cityName': '绍兴', 'currentConfirmedCount': 38, 'confirmedCount': 430, 'suspectedCount': 0, 'curedCount': 392, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 330600, 'currentConfirmedCountStr': '38'}, {'cityName': '金华', 'currentConfirmedCount': 2, 'confirmedCount': 57, 'suspectedCount': 0, 'curedCount': 55, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 330700, 'currentConfirmedCountStr': '2'}, {'cityName': '温州', 'currentConfirmedCount': 0, 'confirmedCount': 504, 'suspectedCount': 0, 'curedCount': 503, 'deadCount': 1, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 330300, 'currentConfirmedCountStr': '0'}, {'cityName': '台州', 'currentConfirmedCount': 0, 'confirmedCount': 147, 'suspectedCount': 0, 'curedCount': 147, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 331000, 'currentConfirmedCountStr': '0'}, {'cityName': '嘉兴', 'currentConfirmedCount': 0, 'confirmedCount': 46, 'suspectedCount': 0, 'curedCount': 46, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 330400, 'currentConfirmedCountStr': '0'}, {'cityName': '省十里丰监狱', 'currentConfirmedCount': 0, 'confirmedCount': 36, 'suspectedCount': 0, 'curedCount': 36, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 0, 'currentConfirmedCountStr': '0'}, {'cityName': '丽水', 'currentConfirmedCount': 0, 'confirmedCount': 17, 'suspectedCount': 0, 'curedCount': 17, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 331100, 'currentConfirmedCountStr': '0'}, {'cityName': '衢州', 'currentConfirmedCount': 0, 'confirmedCount': 14, 'suspectedCount': 0, 'curedCount': 14, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 330800, 'currentConfirmedCountStr': '0'}, {'cityName': '湖州', 'currentConfirmedCount': 0, 'confirmedCount': 10, 'suspectedCount': 0, 'curedCount': 10, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 330500, 'currentConfirmedCountStr': '0'}, {'cityName': '舟山', 'currentConfirmedCount': 0, 'confirmedCount': 10, 'suspectedCount': 0, 'curedCount': 10, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 330900, 'currentConfirmedCountStr': '0'}, {'cityName': '待明确地区', 'currentConfirmedCount': -24, 'confirmedCount': 0, 'suspectedCount': 0, 'curedCount': 24, 'deadCount': 0, 'highDangerCount': 0, 'midDangerCount': 0, 'locationId': 0, 'notShowCurrentConfirmedCount': True, 'currentConfirmedCountStr': '-'}], 'dangerAreas': []}, {'provinceName': '广东省', 'provinceShortName': '广东', 'currentConfirmedCount': 362, 'confirmedCount': 4163, 'suspectedCount': 25, 'curedCount': 3793, 'deadCount': 8, 'comment': '广东卫健委未明确部分治愈病例的地市归属,因此各地市的现存确诊存在一定偏差。', 'locationId': 440000, 'statisticsData': 'https://file1.dxycdn.com/2020/0223/281/3398299758115524068-135.json', 'highDangerCount': 0, 'midDangerCount': 3, 'detectOrgCount': 120, 'vaccinationOrgCount': 42, 'cities': [{'cityName': '深圳', 'currentConfirmedCount': 145, 'confirmedCount': 798, 'suspectedCount': 3, 'curedCount': 650, 'deadCount': 3, 'highDangerCount': 0, 'midDangerCount': 3, 'locationId': 440300, 'currentConfirmedCountStr': '145'}, {'cityName': '广州', 'currentConfirmedCount': 98, 'confirmedCount': 2205, 'suspectedCount': 3, 'curedCount': 2106, 'deadCount': 1, 'highDangerCount': 0, 'midDangerCount': 0,内容过多此处省略
'''