python爬虫_正则表达式获取天气预报并用echarts折线图显示

文章目录

    • ⭐前言
    • ⭐python re库
      • 💖 re.match函数
      • 💖 re.search函数
      • 💖 re.compile 函数
    • ⭐正则获取天气预报
      • 💖 正则实现页面内容提取
      • 💖 echarts的天气折现图
    • ⭐结束

yma16-logo

⭐前言

大家好,我是yma16,本文分享python的正则表达式并可视化展示抓取的天气预报数据。
该系列文章:
python爬虫_基本数据类型
python爬虫_函数的使用
python爬虫_requests的使用
python爬虫_selenuim可视化质量分
python爬虫_django+vue3可视化csdn用户质量分

⭐python re库

正则表达式(Regular expressions,也叫 REs、 regexs 或 regex patterns),是一个特殊的字符序列。
Python 自1.5版本起增加了re 模块,它提供 Perl 风格的正则表达式模式。
re 模块使 Python 语言拥有全部的正则表达式功能。
compile 函数根据一个模式字符串和可选的标志参数生成一个正则表达式对象。该对象拥有一系列方法用于正则表达式匹配和替换。
re 模块也提供了与这些方法功能完全一致的函数,这些函数使用一个模式字符串做为它们的第一个参数。

💖 re.match函数

re.match 尝试从字符串的起始位置匹配一个模式,如果不是起始位置匹配成功的话,match() 就返回 none。

函数语法:

re.match(pattern, string, flags=0)
参数描述
pattern匹配的正则表达式
string要匹配的字符串。
flags标志位,用于控制正则表达式的匹配方式,如:是否区分大小写,多行匹配等等。参见:正则表达式修饰符 - 可选标志

匹配成功 re.match 方法返回一个匹配的对象,否则返回 None。

import re
print(re.match('yma16', 'yma16 in csdn'))
print(re.match('yma16', 'yma16 in csdn').span())
print(re.match('csdn', 'yma16 in csdn'))

运行结果入下:

$ <re.Match object; span=(0, 5), match='yma16'>
$ (0, 5)
$ None

使用 group(num) 或 groups() 匹配对象函数来获取匹配表达式。

import re
line = "yma16 is a csdn player"matchObj = re.match(r'(.*) is (.*?) .*', line, re.M | re.I)if matchObj:print("matchObj.group() : ", matchObj.group())print("matchObj.group(1) : ", matchObj.group(1))print("matchObj.group(2) : ", matchObj.group(2))else:print("No match!!")

运行结果:

matchObj.group() :  yma16 is a csdn player
matchObj.group(1) :  yma16
matchObj.group(2) :  a

💖 re.search函数

re.search 扫描整个字符串并返回第一个成功的匹配。

re.search(pattern, string, flags=0)

示例:

import re
print(re.search('yma16', 'yma16 in csdn'))
print(re.search('yma16', 'yma16 in csdn').span())
print(re.search('csdn', 'yma16 in csdn'))

运行结果:

<re.Match object; span=(0, 5), match=‘yma16’>
(0, 5)
<re.Match object; span=(9, 13), match=‘csdn’>

re.match与re.search的区别
re.match只匹配字符串的开始,如果字符串开始不符合正则表达式,则匹配失败,函数返回None;而re.search匹配整个字符串,直到找到一个匹配。

💖 re.compile 函数

compile 函数用于编译正则表达式,生成一个正则表达式( Pattern )对象,供 match() 和 search() 这两个函数使用。
语法格式为:

re.compile(pattern[, flags])

示例:

import re
pattern = re.compile(r'([a-z]+) ([a-z]+)', re.I)   # re.I 表示忽略大小写
m = pattern.match('csdn hello 2023')
print(m)
if m:print(m.group(0))

运行结果如下:

<re.Match object; span=(0, 10), match=‘csdn hello’>
csdn hello

⭐正则获取天气预报

天气预报的网站:http://www.weather.com.cn/html/weather/101280601.shtml
深圳的天气预报前缀101280601

💖 正则实现页面内容提取

页面元素分析:

  • wea 天气
  • tem 温度
  • win 风向
    weather

python获取代码如下:

import re
from urllib import request
def urllib_request():url = 'http://www.weather.com.cn/html/weather/101280601.shtml'req = request.Request(url)resp = request.urlopen(req)htmlText = resp.read().decode('utf-8')return complie_Work(htmlText)def complie_Work(htmlText):# 正则表达式处理html文本findStyle = re.compile(r'<ul class="t clearfix">(.*?)</ul>', re.S)  # re.S忽略换行(天气的那一行)styles = re.findall(findStyle, htmlText)  # 天气styles = re.sub('<br(\s+)?/>(\s+)?', '', styles[0])findDay = re.compile(r"<h1>(.*?)</h1>", re.S)day = re.findall(findDay, styles)  # 日期findDiscribe=re.compile(r'<p title="(.*?)" class="wea">',re.S)discribe=re.findall(findDiscribe,styles)#天气描述findTem = re.compile(r"<span>(.*?)</span>(.*?)<i>(.*?)</i>", re.S)tem = re.findall(findTem, styles)length=len(tem)title_data=daytemhigh_data=[]temlow_data=[]findEm = re.compile(r"<em>\s<span title=\"(.*?)\"", re.S)em = re.findall(findEm, styles)#风向length = len(day)findWindlevel = re.compile(r"</em>\s<i><(.*?)</i>\s</p>", re.S)wL = re.findall(findWindlevel, styles)#风的等级if length<7:#     获取晚上的温度findtoday=re.compile(r"<p class=\"tem\">\n<i>(.*?)</i>",re.S)today=re.findall(findtoday,styles)s=today[0]t=re.findall(r"\d+\.?\d*", s)temhigh_data.append(t[0])temlow_data.append(t[0])else:print('morning')for i in tem:temhigh_data.append(re.findall(r"\d+\.?\d*", i[0])[0])temlow_data.append(re.findall(r"\d+\.?\d*", i[2])[0])data={'title':title_data,'high':temhigh_data,'low':temlow_data,'discribe':discribe,'windem':em,'windwl': wL,}return dataprint(urllib_request())

运行成功如下图所示:
inscode-python
inscode链接如下:

💖 echarts的天气折现图

html引入vue2的cdn渲染echarts
代码如下:

<!DOCTYPE html>
<html><head><meta charset="utf-8"><title>echarts 滚动事件</title><!-- vue2 生产环境版本,优化了尺寸和速度 --><script src="https://cdn.jsdelivr.net/npm/vue@2"></script><script src="./echarts.js"></script></head><style>#app {position: absolute;height: 100vh;width: 100vw;}</style><body><div id="app"><div><div id="second" style="width: 900px;height:400px;"></div></div></div><script type="text/javascript">const weatherData={'title': ['4日(今天)', '5日(明天)', '6日(后天)', '7日(周五)', '8日(周六)', '9日(周日)', '10日(周一)'], 'high': ['32', '33', '33', '33', '33', '33'], 'low': ['27', '27', '28', '28', '28', '27'], 'discribe': ['多云', '阵雨转多云', '多云', '多云', '多云', '多云', '多云'], 'windem': ['无持续风向', '无持续风向', '西南风', '西南风', '无持续风向', '无持续风向', '西南风'], 'windwl': ['3级', '3级转3-4级', '3级', '3级转3-4级']}const instanceVue = {el: '#app',name: 'ecahrts',data() {return {secondChart: null,maxNum:100,};},mounted() {this.initSecondData()},methods: {initSecondData() {// 基于准备好的dom,初始化echarts实例const myChart = echarts.init(document.getElementById('second'));const option = {title: {text: 'line'},tooltip: {trigger: 'axis'},legend: {},toolbox: {show: true,feature: {dataZoom: {yAxisIndex: 'none'},dataView: {readOnly: false},magicType: {type: ['line', 'bar']},restore: {},saveAsImage: {}}},xAxis: {type: 'category',boundaryGap: false,data: weatherData.title},yAxis: {type: 'value',axisLabel: {formatter: '{value} °C'}},series: [{name: 'Highest',type: 'line',data: weatherData.high,markPoint: {data: [{type: 'max',name: 'Max'},{type: 'min',name: 'Min'}]},markLine: {data: [{type: 'average',name: 'Avg'}]}},{name: 'Lowest',type: 'line',data: weatherData.low,markPoint: {data: [{name: '周最低',value: -2,xAxis: 1,yAxis: -1.5}]},markLine: {data: [{type: 'average',name: 'Avg'},{type: 'max',name: 'Max'},{type: 'min',name: 'Min'}]}}]};myChart.setOption(option);this.secondChart = myChart;}}}// 实例化new Vue(instanceVue);</script></body>
</html>

运行结果如下:
line-wen-chart
inscode如下:

⭐结束

本文分享到这结束,如有错误或者不足之处欢迎指出!
scene

👍 点赞,是我创作的动力!
⭐️ 收藏,是我努力的方向!
✏️ 评论,是我进步的财富!
💖 感谢你的阅读!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/8290.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

MySQL之数据库引擎详解(内附面试题:InnoDB和MyISAM的联系与区别)

&#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 接下来看看由辉辉所写的关于MySQL数据库引擎的相关操作吧 目录 &#x1f973;&#x1f973;Welcome Huihuis Code World ! !&#x1f973;&#x1f973; 一. 数据库引擎是什么&#xff…

问诊住院医疗业务数仓建模实操案例

一、数仓建模实超案例 &#xff08;一&#xff09;前言 医疗业务系统比较复杂&#xff0c;有HIS&#xff1a;医院信息管理系统&#xff08; Hospital Information System&#xff09;、CIS&#xff1a;临床信息系统&#xff08;Clinical Information System&#xff09;、LIS&…

图像处理常用算法(基础)

同图像灰度不同,边界处一般会有明显的边缘,利用此特征可以分割图像。需要说明的是:边缘和物体间的边界并不等同,边缘指的是图像中像素的值有突变的地方,而物体间的边界指的是现实场景中的存在于物体之间的边界。有可能有边缘的地方并非边界,也有可能边界的地方并无边缘,…

13---罗马数字转整数

罗马数字包含以下七种字符: I&#xff0c; V&#xff0c; X&#xff0c; L&#xff0c;C&#xff0c;D 和 M。 字符 数值 I 1 V 5 X 10 L 50 C 100 D 500 M 1000 例如&#xf…

docker进阶

Docker网络 [rootecs-56325218 ~]# docker network ls NETWORK ID NAME DRIVER SCOPE 2c63c1a8145c bridge bridge local 70d3439bbb55 host host local ffc74cf89143 none null local[rootecs-56325218 ~]# docker network cre…

Excel实用技巧 如何将EXCEL中在同个单元格中的汉字和数字分开

右边字符串&#xff0c;左边数字 RIGHT(A1,LENB(A1)-LEN(A1)) LEFT(A1,2*LEN(A1)-LENB(A1)) 左边字符串&#xff0c;右边数字 LEFT(A1,LENB(A1)-LEN(A1)) RIGHT(A1,2*LEN(A1)-LENB(A1))

【数学建模系列】TOPSIS法的算法步骤及实战应用——MATLAB实现

文章目录 TOPSIS简介方法和原理数学定义数学语言描述现实案例 正负理想解定义实例 量纲 TOPSIS法的算法步骤1.用向量规范化的方法求得规范决策矩阵2.构成加权规范阵C(c~ij~)~m*n~3.确定正负理想解的距离4.计算各方案到正理想解与负理想解的距离5.计算各方案的综合评价指数6.排列…

java阻塞队列/kafka/spring整合kafka

queue增加删除元素 增加元素 add方法在添加元素的时候&#xff0c;若超出了度列的长度会直接抛出异常&#xff1a;put方法&#xff0c;若向队尾添加元素的时候发现队列已经满了会发生阻塞一直等待空间&#xff0c;以加入元素offer方法在添加元素时&#xff0c;如果发现队列已满…

机器学习算法基础学习 # 集成学习之随机森林

随机森林(Random Forests) 是集成学习算法的一种。集成学习是通过组合多个学习器来完成学习任务。随机森林是结合多颗决策树来对样本进行训练和预测。随机森林通过随机扰动而令所有的树去相关。 随机森林可以使用巨量的预测器&#xff0c;甚至预测器的数量比观察样本的数量还多…

解决PyInstaller打包selenium脚本时弹出driver终端窗口

解决PyInstaller打包selenium脚本时弹出driver终端窗口 找到service.py C:\Users\XXX\AppData\Roaming\Python\Python39\site-packages\selenium\webdriver\common\service.py添加creationflags 在第77行添加: creationflags134217728使用PyInstaller打包 pyinstaller -F -w -…

Springboot集成magic-api

目录 1、前言 2、springboot集成magic-api 2.1、添加maven依赖 2.2、application.yml配置 2.3、编写测试接口 2.4、启动程序&#xff0c;访问接口 2.5、magic-api脚本 3、magic-api其他语法 4、注意事项 1、前言 今天项目中遇到一个问题&#xff0c;springboot后端项目…

找出一个List中每个元素出现的次数

文章目录 一、需求&#xff1a;找出一个list中&#xff0c;每个元素出现的次数1. 普通实现&#xff08;hashmap&#xff09;&#xff1a;1.1 代码实现&#xff1a;1.2运行结果&#xff1a;1.3 案例分析&#xff1a; 2. 普通实现&#xff08;HashSet#Collections.frequency&…