在?爬个天气预报给qq邮箱
  6DMaaPzJglxt 2023年12月05日 18 0



天气

  • 前言
  • python 正则表达式
  • 操作步骤
  • urllib库访问天气
  • request
  • 正则表达式提取
  • re
  • 邮件发送html格式的表格
  • smtp
  • 合并
  • 结束



在?爬个天气预报给qq邮箱_python

前言

大家好,我是yma16,本文分享用python爬个天气预报给qq邮箱。

python 正则表达式

Python的正则表达式是一种强大的文本匹配工具,可以用来检索、替换和解析文本。Python的正则表达式模块是re,可以通过import re来使用。

以下是一些常用的正则表达式:

  1. 匹配任意字符:. (点号)
  2. 匹配指定字符:[abc] 表示匹配a、b或c中任意一个字符; [a-zA-Z] 表示匹配任何一个大写或小写字母
  3. 匹配次数:* 表示匹配前一个字符的0个或多个; + 表示匹配前一个字符的1个或多个; ? 表示匹配前一个字符的0个或1个
  4. 表示匹配位置:^ 表示匹配字符串的开头; $ 表示匹配字符串的结尾
  5. 分组匹配:使用括号 () 来进行分组匹配
  6. 贪婪匹配与非贪婪匹配:使用?来进行非贪婪匹配,如:*?、+?、??等

例如,可以使用正则表达式re.findall(r’\d+‘, s)来匹配字符串s中的所有数字;使用re.sub(r’apple’, ‘orange’, s)来将字符串s中的所有“apple”替换为“orange”。

更详细的正则表达式语法和使用可以参考Python文档中的正则表达式部分。

操作步骤

效果图如下:

在?爬个天气预报给qq邮箱_正则表达式_02

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表单的数据

在?爬个天气预报给qq邮箱_python_03

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的授权码

在?爬个天气预报给qq邮箱_正则表达式_04

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')

运行成功!

在?爬个天气预报给qq邮箱_Text_05


在?爬个天气预报给qq邮箱_正则表达式_06

结束

本文分享到这结束,如有错误或者不足之处欢迎指出,感谢大家的阅读!


【版权声明】本文内容来自摩杜云社区用户原创、第三方投稿、转载,内容版权归原作者所有。本网站的目的在于传递更多信息,不拥有版权,亦不承担相应法律责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@moduyun.com

  1. 分享:
最后一次编辑于 2023年12月05日 0

暂无评论

推荐阅读
  2Fnpj8K6xSCR   2024年05月17日   107   0   0 Python
  xKQN3Agd2ZMK   2024年05月17日   75   0   0 Python
  fwjWaDlWXE4h   2024年05月17日   38   0   0 Python
  Ugrw6b9GgRUv   2024年05月17日   43   0   0 Python
6DMaaPzJglxt