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

news2024/11/25 7:49:15

文章目录

    • ⭐前言
    • ⭐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=day
    temhigh_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 data

print(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.coloradmin.cn/o/719040.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

SpringBoot使用EasyExcel批量导出500万数据

SpringBoot使用EasyExcel批量导出500万数据 说明excel版本比较EasyExcel介绍项目目录mysql对应表建表语句pom.xmlapplication.yml配置类启动类代码OrderInfo 实体类OrderInfoExcel excel模版标题类(EasyExcel需要使用这个)TestController控制层接口层TestServiceTestServiceImp…

L298N模块驱动2项4线步进电机的多种方法及其优缺点

摘要&#xff1a;本文将详细介绍L298N模块驱动2项4线步进电机的多种方法&#xff0c;并分析各种方法的优缺点。在实例程序中&#xff0c;将展示不同方法的代码示例&#xff0c;帮助读者理解并实际应用。 引言&#xff1a; 步进电机作为一种常用的电机类型&#xff0c;在许多嵌入…

估值 2 个月从 11 亿美元降到 3 亿美元,投资人清仓跑路,国产大模型创业遇冷...

图片来源&#xff1a;由无界 AI生成 创业未半&#xff0c;而中道崩殂。 6 月 29 日&#xff0c;美团发布公告以 20.65 亿元全资收购光年之外全部权益&#xff0c;距离光年之外正式营业刚过去 84 天。 这是目前中国大模型创业领域最大的收购案&#xff0c;光年之外也在 4 个月时…

HTML5 游戏开发实战 | 黑白棋

黑白棋&#xff0c;又叫反棋(Reversi)、奥赛罗棋(Othello)、苹果棋、翻转棋。黑白棋在西方和日本很流行。游戏通过相互翻转对方的棋子&#xff0c;最后以棋盘上谁的棋子多来判断胜负。黑白棋的棋盘是一个有88方格的棋盘。开始时在棋盘正中有两白两黑四个棋子交叉放置&#xff0…

观察级水下机器人第一次使用总结2023年6月

最近有个科研项目需要用到ROV&#xff0c;其合同三年之前就签订了&#xff0c;由于疫情的影响&#xff0c;一直没有执行。刚好我们的ROV也验收了&#xff0c;正好派上用场。因为属于ROV使用的菜鸟级&#xff0c;我们邀请厂家无锡智海张工和陈工&#xff0c;中海辉固ROV操作经验…

纵向越权-业务安全测试实操(32)

纵向越权 某办公系统普通用户权限越权提升为系统权限 服务器为鉴别客户端浏览器会话及身份信息,会将用户身份信息存储在 Cookie中, 并发送至客户端存储。攻击者通过尝试修改Cookie中的身份标识为管理员,欺骗服务器分 配管理员权限,达到垂直越权的目的,如图所示。 某办公系…

「原汤话原食」更名「记者下班」,一切才刚刚开始

大家好&#xff0c;我是《原汤话原食》的小黑。这可能是我最后一次这样介绍自己。 毕竟&#xff0c;以后&#xff0c;我就得说&#xff0c;我是《记者下班》的小黑了。 事情是这样的&#xff1a; 2023年7月5日&#xff0c;津津乐道播客网络旗下《原汤话原食》节目正式更名为《记…

Claude使用教程,解决Claude不能回复

Claude是ChatGPT最为有⼒的竞争对⼿之⼀&#xff0c;Claude 的研发公司是专注人工智能安全和研究的初创公司 Anthropic&#xff0c;由前 OpenAI 员工共同创立的。今年 3 月份 Anthropic 获得了谷歌 3 亿美元的投资&#xff0c;谷歌也因此获得其 10% 股份。 ⽬前可以通过官⽹加…

day29-Oracle

0目录 第一章 Oracle 1.1 Oracle表空间-创建&#xff1a; 1.2 Oracle表空间-删除&#xff1a; 1.3 Oracle常用用户&#xff08;内置&#xff09;&#xff1a;&#xff08;1&#xff09;sys 超级用户&#xff1a; 定义&#xff1a;它是Oracle中的超级账户&#xff0…

百度算法提前批 面试复盘

作者 | liu_sy 面试锦囊之面经分享系列&#xff0c;持续更新中 欢迎后台回复"面试"加入讨论组交流噢 写在前面 之前通过非定向内推提前批&#xff0c;简历一直处于筛选状态中&#xff0c;然后大概在牛客看到一个前辈所在部门&#xff08;推荐搜索&#xff09;招人&…

【docker】在windows下配置linux深度学习环境并开启ssh远程连接

liunux下配置深度学习程序方便&#xff0c;windows下用起来更习惯。 windows下直接利用虚拟机是不太容易对GPU进行虚拟&#xff0c;利用docker就可以。这里简单介绍了在win主机下如利用docker&#xff0c;配置虚拟机环境&#xff0c;并和主机开启ssh连接配置。 配置与系统要求…

Delta数据湖upsert调优---1000多列表的调优

背景 本文基于 spark 3.1.1 delta 1.0.0 目前在我们公司遇到了一个任务写delta&#xff08;主要是的upsert操作&#xff09;&#xff0c;写入的时间超过了6个小时&#xff0c;该spark主要的做的事情是&#xff1a; 一行数据变几百行开窗函数去重调用pivot函数 行列的转换&…

Linux 串口工具minicom

Linux minicom Linux中的Minicom是一个串口通信工具&#xff0c;用于与外部设备进行串口通信。它可以用于与嵌入式设备、调试设备、网络设备等进行通信和配置。 调试和配置串口设备&#xff1a;minicom可以用于连接和调试各种串口设备&#xff0c;如调制解调器、路由器、交换…

软件DevOps云化发展的趋势 【课程限时免费】

你了解什么是DevOps吗&#xff1f; 它是怎么诞生的&#xff1f; DevOps能做些什么&#xff1f; 相信对于DevOps的实践者和关注者来说&#xff0c;对它已经不陌生了&#xff0c;但是对于刚刚进入开发者领域不久的小伙伴应该并不清楚&#xff0c;下面就让小智带你一起了解DevO…

node初识

一、什么是node node官网&#xff1a;https://nodejs.cn/ Node.js是一个开源的、跨平台的JavaScript运行环境。它基于Chrome V8 JavaScript引擎&#xff0c;使得JavaScript可以在服务器端运行。Node.js具有事件驱动、非阻塞式I/O的特性&#xff0c;适用于开发高性能的网络应…

ue4_Dota总结 GameMode篇

一&#xff1a;框架设计 新建地图M01&#xff1b; 创建gamemode&#xff1b; 创建gamestate&#xff1b; 创建playercontroller&#xff1b; 创建hud&#xff1b; 创建pawn&#xff1b; 将gamemode设置为M01地图中&#xff1b;将gamestate/playercontroller/hud/pawn添加…

SourceTree 切换分支时提示框 OpenSSH助手验证失败

问题描述&#xff1a; 这是我找的别的图&#xff0c;我自己的图忘记截了&#xff0c;大概意思差不多&#xff0c;就是服务器验证失败&#xff1a; 解决办法 &#xff1a;以下3步 1、命令行输入 ssh-keygen 然后一直下一步&#xff0c;直到结束&#xff0c;密钥和公钥会…

Dbeaver 往s4 HANA自建表 导入数据

今天有一份数据 13W行 需要导入S4 自建表。本来搞了一个通用的自建表导入程序&#xff0c;无奈13W行的数据就是无法读取&#xff0c;200行倒是可以。 那非常时期&#xff0c;用非常手段&#xff0c;尝试了一下刺激&#xff0c;dbeaver 导入到S4 HANA数据 后面试一下&#xff…

【运维工程师学习】磁盘相关知识——磁盘、柱面、磁道、磁头、扇区、格式化

【运维工程师学习】磁盘 1、DOS&#xff08;Disk Operating System&#xff09;2、硬盘坏道(1)逻辑坏道(2)物理坏道(3)检查坏道(4)原因(5)修复修复逻辑坏道用Scandisk检查用软件隐藏物理坏道低级格式化修复坏道 3、柱面4、扇区5、磁道6、数据区(1)数据区的内容(2)数据区根目录分…

logstash过滤器插件--translate

logstash过滤器之translate 官方手册&#xff1a;https://www.elastic.co/guide/en/logstash/current/plugins-filters-translate.html#plugins-filters-translate-target 功能描述 translate过滤器插件用于根据字典或查找文件过滤传入数据中的特定字段&#xff0c;如果输入…