天气
- 前言
- python 正则表达式
- 操作步骤
- urllib库访问天气
- request
- 正则表达式提取
- re
- 邮件发送html格式的表格
- smtp
- 合并
- 结束
前言
大家好,我是yma16,本文分享用python爬个天气预报给qq邮箱。
python 正则表达式
Python的正则表达式是一种强大的文本匹配工具,可以用来检索、替换和解析文本。Python的正则表达式模块是re,可以通过import re来使用。
以下是一些常用的正则表达式:
- 匹配任意字符:. (点号)
- 匹配指定字符:[abc] 表示匹配a、b或c中任意一个字符; [a-zA-Z] 表示匹配任何一个大写或小写字母
- 匹配次数:* 表示匹配前一个字符的0个或多个; + 表示匹配前一个字符的1个或多个; ? 表示匹配前一个字符的0个或1个
- 表示匹配位置:^ 表示匹配字符串的开头; $ 表示匹配字符串的结尾
- 分组匹配:使用括号 () 来进行分组匹配
- 贪婪匹配与非贪婪匹配:使用?来进行非贪婪匹配,如:*?、+?、??等
例如,可以使用正则表达式re.findall(r’\d+‘, s)来匹配字符串s中的所有数字;使用re.sub(r’apple’, ‘orange’, s)来将字符串s中的所有“apple”替换为“orange”。
更详细的正则表达式语法和使用可以参考Python文档中的正则表达式部分。
操作步骤
效果图如下:
urllib库访问天气
request
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"
}
url = 'http://www.weather.com.cn/html/weather/101260101.shtml'
req = request.Request(url, headers=headers)
resp = request.urlopen(req)
htmlText = resp.read().decode('utf-8')
正则表达式提取
re
获取html表单的数据
findStyle = re.compile(r'<ul class="t clearfix">(.*?)</ul>', re.S) # re.S忽略换行
styles = re.findall(findStyle, htmlText) # 天气
# print(styles)
styles = re.sub('<br(\s+)?/>(\s+)?', '', styles[0])
# print(styles)
findDay = re.compile(r"<h1>(.*?)</h1>", re.S)
day = re.findall(findDay, styles) # 日期
findWea = re.compile(r"<p title=\"(.*?)\" class=\"wea\">", re.S)
wea = re.findall(findWea, styles)
findT = re.compile(r"<span>(.*?)</span>(.*?)<i>(.*?)</i>", re.S)
tt = re.findall(findT, styles)
邮件发送html格式的表格
smtp
SMTP(Simple Mail Transfer Protocol)即简单邮件传输协议
qq邮箱获取smtp的授权码
ret = True
my_sender = '1432448610@qq.com' # 发件人邮箱账号
my_pass = '****' # 授权码
my_user = '1432448610@qq.com' # 收件人邮箱账号,我这边发送给自己
try:
msg = MIMEText(text, 'html', 'utf-8')
msg['From'] = formataddr(["yma16", my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To'] = formataddr(["yma16", my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = Header("天气预报", 'utf-8') # 邮件的主题,也可以说是标题
server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25 ,填写465
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、授权码
server.sendmail(my_sender, [my_user, ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except Exception as e: # catch
print(e)
ret = False
合并
from urllib import request
import requests,re,xlwt,smtplib
from email.mime.text import MIMEText
from email.utils import formataddr
from email.header import Header
import matplotlib.pyplot as plt
def urllib_request():
headers = {
"user-agent": "Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/85.0.4183.83 Safari/537.36"
}
url = 'http://www.weather.com.cn/html/weather/101260101.shtml'
req = request.Request(url, headers=headers)
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) # 天气
# print(styles)
styles = re.sub('<br(\s+)?/>(\s+)?', '', styles[0])
# print(styles)
findDay = re.compile(r"<h1>(.*?)</h1>", re.S)
day = re.findall(findDay, styles) # 日期
findWea = re.compile(r"<p title=\"(.*?)\" class=\"wea\">", re.S)
wea = re.findall(findWea, styles)
findT = re.compile(r"<span>(.*?)</span>(.*?)<i>(.*?)</i>", re.S)
tt = re.findall(findT, styles)
i = 0
for t in tt:
# print(t)
s = ''
for temp in t:
# print(temp)
s += temp
tt[i] = s
i += 1
# 处理温度 元组
findEm = re.compile(r"<em>\s<span title=\"(.*?)\"", re.S)
em = re.findall(findEm, styles)
length = len(day)
# print(length, len(tt), tt)
findWindlevel = re.compile(r"</em>\s<i><(.*?)</i>\s</p>", re.S)
wL = re.findall(findWindlevel, styles)
title='日期 天气 温度 风向 风级\n'
style_css='<style>#customers {font-family: Arial, Helvetica, sans-serif; border-collapse: collapse; width: 100%; } #customers td, #customers th { border: 1px solid #ddd; padding: 8px; } #customers tr:nth-child(even){background-color: #f2f2f2;} #customers tr:hover {background-color: #ddd;} #customers th { padding-top: 12px; padding-bottom: 12px; text-align: left; background-color: #006cff; color: white; }</style>'
table_header='<table id="customers"><caption>贵阳天气预报!</caption><tr><th>日期</th><th>天气</th><th>温度</th><th>风向</th><th>风级</th></tr>'
content=''
i=1
for loc in range(0, length):
i+=1
print(day[loc], wea[loc], str(tt[loc]), em[loc], wL[loc])
content+='<tr><td>'+day[loc]+'</td>'+'<td>'+wea[loc]+'</td>'+'<td>'+str(tt[loc])+'</td>'+'<td>'+em[loc]+'</td>'+'<td>'+wL[loc]+'</td>'+'</tr>'
content+='</table>'
text=style_css+table_header+content
print(text)
return send_mail(text)
# 第三方 SMTP 服务
def send_mail(text):# 发送
ret = True
my_sender = '1432448610@qq.com' # 发件人邮箱账号
my_pass = '****' # 授权码
my_user = '1432448610@qq.com' # 收件人邮箱账号,我这边发送给自己
try:
msg = MIMEText(text, 'html', 'utf-8')
msg['From'] = formataddr(["yma16", my_sender]) # 括号里的对应发件人邮箱昵称、发件人邮箱账号
msg['To'] = formataddr(["yma16", my_user]) # 括号里的对应收件人邮箱昵称、收件人邮箱账号
msg['Subject'] = Header("天气预报", 'utf-8') # 邮件的主题,也可以说是标题
server = smtplib.SMTP_SSL("smtp.qq.com", 465) # 发件人邮箱中的SMTP服务器,端口是25
server.login(my_sender, my_pass) # 括号中对应的是发件人邮箱账号、授权码
server.sendmail(my_sender, [my_user, ], msg.as_string()) # 括号中对应的是发件人邮箱账号、收件人邮箱账号、发送邮件
server.quit() # 关闭连接
except Exception as e: # catch
print(e)
ret = False
return ret
ret = urllib_request()
print("success") if ret else print('failed')
运行成功!
结束
本文分享到这结束,如有错误或者不足之处欢迎指出,感谢大家的阅读!