在日常生活中,天气预报是我们不可或缺的信息。如果能让电脑自动获取天气预报并通过语音播报出来,无疑会为我们的生活带来更多便利。本文将介绍一个使用Python实现的天气预报语音播报程序,它能够从网络获取未来一周的天气信息,并通过语音清晰地播报出来。
本程序实现了完整的天气数据获取、处理和语音播报流程,展示了Python在实际应用中的强大能力。通过学习本项目,您可以掌握网络请求、HTML解析、数据处理和语音合成等实用技能。
这个天气预报语音播报程序主要使用了以下几个Python库:
这些库都是Python生态系统中非常实用的工具,通过它们的组合使用,我们可以轻松实现从网络获取数据到语音合成的完整流程。
这个程序的核心功能可以分为三个主要部分:
首先,我们需要从天气网站获取天气数据。程序中使用的是2345天气网。
import pyttsx3
import requests
from lxml import etree
import time
if __name__ == '__main__':
url_ = 'https://tianqi.2345.com/'
headers_ = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36',
'Cookie': 'BAIDU_SSP_lcr=https://www.baidu.com/link?url=2_kcGFULpmOGesd7t4XR05Uk5SP4mO4jG-fgBdkwFbebqlXoVbysDnuM7sr0QuyL&wd=&eqid=fe17baab0006be82000000066155522a; Hm_lvt_a3f2879f6b3620a363bec646b7a8bcdd=1632973860,1632973883,1632981759,1632981769; Hm_lpvt_a3f2879f6b3620a363bec646b7a8bcdd=1632981769',
'Referer': 'https://www.baidu.com/link?url=2_kcGFULpmOGesd7t4XR05Uk5SP4mO4jG-fgBdkwFbebqlXoVbysDnuM7sr0QuyL&wd=&eqid=fe17baab0006be82000000066155522a'
}
response_ = requests.get(url_, headers=headers_)
data_ = response_.text
在这段代码中:
获取到网页内容后,我们需要从中提取出天气信息。这里使用lxml库来解析HTML内容:
data_obj = etree.HTML(data_)
# 提取包含未来一周的天气数据块(原J_bannerList可能包含7天数据)
n = data_obj.xpath('//div[@id="J_bannerList"]/div//text()')
list_c = []
# 清洗数据:去除空格和换行
for i in range(len(n)):
k = n[i].replace(" ", "")
j = k.replace("\n", "")
list_c.append(j)
# 过滤空字符串,假设前4个元素为无关数据,后续每4个元素为一天的信息(日期/天气/温度/风力)
clean_data = list(filter(None, list_c))
# 提取未来7天数据(假设从索引4开始,每4个元素为一天)
weekly_data = clean_data[4:4+7*4] # 7天 × 4字段 = 28个元素
这段代码的主要功能是:
提取到天气数据后,我们需要对其进行格式化处理,使其更符合我们的阅读习惯:
# 处理每天的日期格式(原逻辑扩展为循环处理7天)
formatted_days = []
for day_idx in range(7):
# 计算当前天在weekly_data中的起始索引(每天占4个元素)
start_idx = day_idx * 4
date_str = weekly_data[start_idx + 1] # 第2个元素是日期(如"10/01")
weather = weekly_data[start_idx + 2] # 第3个元素是天气(如"晴")
temp = weekly_data[start_idx + 3] # 第4个元素是温度(如"15~25℃")
# 格式化日期(原逻辑)
month, day = date_str.split('/')
formatted_date = f"{month}月{day}日"
formatted_days.append(f"{formatted_date} {weather} {temp}")
# 拼接未来一周预报字符串
b = "未来一周天气预报:" + ";".join(formatted_days) + "。加油python人!"
print(b)
在数据格式化部分:
最后,我们使用pyttsx3库将整理好的天气预报信息转换为语音并播报出来:
a = pyttsx3.init()
a.say(b)
a.runAndWait()
这段代码非常简洁,主要做了三件事:
这个天气预报语音播报程序已经实现了基本功能,但还有很多可以优化和拓展的地方:
目前程序没有完善的错误处理机制,可以考虑添加以下功能:
可以在现有功能的基础上添加更多实用功能:
如果需要更好的用户体验,可以考虑添加图形界面:
以下是完整的程序代码,你可以直接运行它来获取未来一周的天气预报并听到语音播报。
import pyttsx3
import requests
from lxml import etree
import time
if __name__ == '__main__':
url_ = 'https://tianqi.2345.com/'
headers_ = {
'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.54 Safari/537.36',
'Cookie': 'BAIDU_SSP_lcr=https://www.baidu.com/link?url=2_kcGFULpmOGesd7t4XR05Uk5SP4mO4jG-fgBdkwFbebqlXoVbysDnuM7sr0QuyL&wd=&eqid=fe17baab0006be82000000066155522a; Hm_lvt_a3f2879f6b3620a363bec646b7a8bcdd=1632973860,1632973883,1632981759,1632981769; Hm_lpvt_a3f2879f6b3620a363bec646b7a8bcdd=1632981769',
'Referer': 'https://www.baidu.com/link?url=2_kcGFULpmOGesd7t4XR05Uk5SP4mO4jG-fgBdkwFbebqlXoVbysDnuM7sr0QuyL&wd=&eqid=fe17baab0006be82000000066155522a'
}
response_ = requests.get(url_, headers=headers_)
data_ = response_.text
data_obj = etree.HTML(data_)
# 提取包含未来一周的天气数据块(原J_bannerList可能包含7天数据)
n = data_obj.xpath('//div[@id="J_bannerList"]/div//text()')
list_c = []
# 清洗数据:去除空格和换行
for i in range(len(n)):
k = n[i].replace(" ", "")
j = k.replace("\n", "")
list_c.append(j)
# 过滤空字符串,假设前4个元素为无关数据,后续每4个元素为一天的信息(日期/天气/温度/风力)
clean_data = list(filter(None, list_c))
# 提取未来7天数据(假设从索引4开始,每4个元素为一天)
weekly_data = clean_data[4:4+7*4] # 7天 × 4字段 = 28个元素
# 处理每天的日期格式(原逻辑扩展为循环处理7天)
formatted_days = []
for day_idx in range(7):
# 计算当前天在weekly_data中的起始索引(每天占4个元素)
start_idx = day_idx * 4
date_str = weekly_data[start_idx + 1] # 第2个元素是日期(如"10/01")
weather = weekly_data[start_idx + 2] # 第3个元素是天气(如"晴")
temp = weekly_data[start_idx + 3] # 第4个元素是温度(如"15~25℃")
# 格式化日期(原逻辑)
month, day = date_str.split('/')
formatted_date = f"{month}月{day}日"
formatted_days.append(f"{formatted_date} {weather} {temp}")
# 拼接未来一周预报字符串
b = "未来一周天气预报:" + ";".join(formatted_days) + "。加油python人!"
print(b)
a = pyttsx3.init()
a.say(b)
a.runAndWait()
通过这个Python天气预报语音播报程序,我们展示了如何将网络数据获取、HTML解析、数据处理和语音合成等功能结合起来,实现一个实用的小工具。这个程序不仅展示了Python在网络数据处理和语音合成方面的能力,也为我们提供了一个很好的项目实践案例。
希望本文能帮助你更好地理解Python在实际应用中的开发过程,如果你对程序有任何改进意见或新的想法,欢迎一起探讨。让我们一起用Python创造更多实用的小工具,让生活变得更加便捷!