Python疫情数据的爬虫和可视化显示(三)_json模块


_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字符串

思路

  1. 发送请求,获取疫情首页
  2. 从疫情首页中提取各国的疫情字符串
  3. 从各国疫情字符串中,提取json格式字符串
  4. 把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)
  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值