文章目录
_json模块
json模块介绍
这一次我们不需要额外下载package了,json模块是pyhon自带的模块,用于json与python数据之间的相互转换
json与python数据类型的对应关系
json还是属于另一套语言的数据类型,在定义上与python不太相同,但是大部分可以一一对应,具体怎么用,后面再说,现有这个概念就可以了
在上面的小例子中,我们可以看到第一个中括号[]括起来的内容,就是json数据中的array类型,也就对照的是python的list类型。
第二个的**花括号{}**括起来的内容是json的对象object,对应到python就是字典dict。剩下的同理
应用json模块,把json转化为Python
首先是图解,其实就是借助json.load进行重新的加载,然后转换数据类型,注意这里字符串和json文件,使用的函数是不一样的,分别是一个又s,一个没s,并且json.load是输入字符串,json.loads是输入json格式文件
json.load(s)
json.load(fp)
1. 把json字符串,转换为python类型数据
[{"provinceName":"美国","currentConfirmedCount":1179041,"confirmedCount":1643499},
{"provinceName":"英国","currentConfirmedCount":222227,"confirmedCount":259559}]
这段json格式的数据,直接输入的呢就是字符串,也可以保存为json格式,作为文件输入,首先是json字符串的转换
代码我贴在最后面,这里使用json.loads()函数,我们通过输出的打印,可以看到,转换后的数据双引号变成了单引号,单引号是python的格式
这样肯定还不够直观,我们可以打印出来数据类型进行对比
通过这里,对比上面的表格,就可以比较直观的看到,我们转换后数据类型发生了变化
# 导入json模块
import json
# 1. 把json字符串,转换为python类型数据
# 1.1 准备json字符串
json_str = '''[{"provinceName":"美国","currentConfirmedCount":1179041,"confirmedCount":1643499},
{"provinceName":"英国","currentConfirmedCount":222227,"confirmedCount":259559}]'''
print("json类型数据\n",type(json_str))
print(type(json_str[0]))
# 1.2 把json字符串,转换为python类型数据
rs = json.loads(json_str)
# print(rs)
print("python类型数据\n",type(rs))
print(type(rs[0]))
2. 把json格式文件,转换为python类型的数据
这里我们先把数据保存成test.json
文件,然后存放在和我们的代码的同一目录下
with open('./test.json') as fp:
这个代码的含义就是打开我们的json文件,“./test.json”
就是告诉我们的程序在程序当前的目录下寻找test.json文件
# 导入json模块
import json
# 1. 把json字符串,转换为python类型数据
# 1.1 准备json字符串
json_str = '''[{"provinceName":"美国","currentConfirmedCount":1179041,"confirmedCount":1643499},
{"provinceName":"英国","currentConfirmedCount":222227,"confirmedCount":259559}]'''
# print("json类型数据\n",type(json_str))
# print(type(json_str[0]))
# 1.2 把json字符串,转换为python类型数据
rs = json.loads(json_str)
# print(rs)
# print("python类型数据\n",type(rs))
# print(type(rs[0]))
# 2 把json格式文件,转换为python类型的数据
# 2.1 构建指向该文件的文件对象
with open('./test.json') as fp:
# 2.2 加载该文件对象,转换为python类型的数据
python_str = json.load(fp)
print(python_str)
print("python类型数据\n",type(python_str))
print(type(python_str[0]))
应用json模块,把Python转化为json
1. 把python转换为json字符串
import json
# 1. 把python转换为json字符串
# 1.1 python类型数据
json_str = '''[{"provinceName":"美国","currentConfirmedCount":1179041,"confirmedCount":1643499},
{"provinceName":"英国","currentConfirmedCount":222227,"confirmedCount":259559}]'''
python_data = json.loads(json_str)
# 1.2把python类型数据转换为json字符串
json_str = json.dumps(python_data)
print(json_str)
套路一样,因为我们只有json类型的数据,所以我们先用之前的操作得到一个python数据,在使用json.loads(json_str)
操作进行格式的转换
直接这样转换后得到的数据,我们打印出来发现是acii码
显示
json_str = json.dumps(python_data, ensure_ascii=False)
通过修改json.dumps,取消掉ascii输出就好了
这样我们的python数据转json字符串就算成功了,下面来看一下数据类型
2. 把python以json格式存储到文件中
import json
# 1. 把python转换为json字符串
# 1.1 python类型数据
json_str = '''[{"provinceName":"美国","currentConfirmedCount":1179041,"confirmedCount":1643499},
{"provinceName":"英国","currentConfirmedCount":222227,"confirmedCount":259559}]'''
python_data = json.loads(json_str)
# print("python数据类型\n",type(python_data))
# print(type(python_data[0]))
# 1.2把python类型数据转换为json字符串
json_str = json.dumps(python_data, ensure_ascii=False)
# print(json_str)
# print("json数据类型\n",type(json_str))
# print(type(json_str[0]))
# 2. 把python以json格式存储到文件中
# 2.1 构建要写入文件对象
with open('./write2json.json', 'w') as fp:
# 2.2 把python以json格式存储到文件中
json.dump(python_data, fp,ensure_ascii = False)
案例:解析最新的疫情数据的json字符串
思路
- 发送请求,获取疫情首页
- 从疫情首页中提取各国的疫情字符串
- 从各国疫情字符串中,提取json格式字符串
- 把json格式字符串,转换为python类型
前面的代码我们已经完成,这次只需要加上我们的转换代码就可以了
错误排查
# 1. 导入相关模块
import requests #导入请求
import re
import bs4 #导入数据
import json
# 2. 发送请求,获取疫情首页的内容
# 2.1 发送请求,获取响应
response = requests.get('http://ncov.dxy.cn/ncovh5/view/pneumonia')
# 2.2 从响应中获取数据
home_page = response.content.decode()
# 3. 使用Beautiful Soup提取疫情数据
# 3.1 构建Beautiful Soup对象
soup = bs4.BeautifulSoup(home_page, 'lxml')
# 3.2 根据id属性查找,包含各国疫情信息的标签
find_script = soup.find(id = "getListByCountryTypeService2true")
# 3.3 获取中文文本的内容
country_text = find_script.string
# 4. 使用正则表达式提取json字符串
json_str = re.findall(r'\[.+\]', country_text)
# 5.把json字符串,转换为python类型数据
country_python_data = json.loads(json_str)
print(country_python_data)
首先呢这个是一个错误的代码,运行后会出现这样的错误
根据错误提示,我们的数据类型有问题,那么会去检查我们的json_str数据类型是怎么回事儿
通过查看数据,我们发现是json格式没有错误,那么是哪里有问题呢?
继续查看
这里是json确实是list类型,而前面也说了list类型是python的数据类型,这是个列表的格式,这是为什么呢?
我们可以打印出来我们的json数据类型,就可以发现玄机了
直接打印print(type(json_str)),会显示json_str为列表格式,而打印print(type(json_str[0]))就会看到是字符串类型了
这是为什么呢?是因为我们忽略了一个地方
我们的字符串本来就存储在 json_str[0] 中,所以,我们这里输入也要输入 json_str[0] ,而 json_str[0] 的数据类型就是str,我们需要的json字符串类型
修改之后,就可以看到正确的输出结果啦
代码
# 1. 导入相关模块
import requests #导入请求
import re
import bs4 #导入数据
import json
# 2. 发送请求,获取疫情首页的内容
# 2.1 发送请求,获取响应
response = requests.get('http://ncov.dxy.cn/ncovh5/view/pneumonia')
# 2.2 从响应中获取数据
home_page = response.content.decode()
# 3. 使用Beautiful Soup提取疫情数据
# 3.1 构建Beautiful Soup对象
soup = bs4.BeautifulSoup(home_page, 'lxml')
# 3.2 根据id属性查找,包含各国疫情信息的标签
find_script = soup.find(id = "getListByCountryTypeService2true")
# 3.3 获取中文文本的内容
country_text = find_script.string
# 4. 使用正则表达式提取json字符串
json_str = re.findall(r'\[.+\]', country_text)
# print(type(json_str))
# print(type(json_str[0]))
# 5.把json字符串,转换为python类型数据
country_python_data = json.loads(json_str[0])
print(country_python_data)