parent: 返回当前节点的父节点

发布时间:2025-06-24 20:26:53  作者:北方职教升学中心  阅读量:620


在这里插入图片描述

一、find_all(): 查找所有匹配到的节点,并返回一个列表。

二、descendants: 返回当前节点的所有子孙节点的迭代器。

parent: 返回当前节点的父节点。parents: 返回当前节点的所有祖先节点的迭代器。网络爬虫程序设计

1.数据爬取与采集

数据源:https://lishi.tianqi.com/quanzhou/

所用到的库有

1 import requests # 模拟浏览器进行网络请求2 from lxml import etree # 进行数据预处理3 import csv # 进行写入csv文件

使用requests中的get方法对网站发出请求,并接收响应数据,

1 resp = requests.get(url, headers=headers)

我们便得到了网页的源代码数据,

2.对数据进行清洗和处理

然后对爬取的网站源代码进行预处理

1 resp_html = etree.HTML(resp.text)

使用xpath工具提取我们所需要的数据

1 resp_list = resp_html.xpath(“//ul[@class=‘thrui’]/li”)

创建一个字典,并使用for循环将我们所提取的数据,放入字典中

1 for li in resp\_list: 2 day\_weather\_info = {} 3 # 日期 4 day\_weather\_info\['date\_time'\] = li.xpath("./div\[1\]/text()")\[0\].split(' ')\[0\] 5 # 最高气温 (包含摄氏度符号) 6 high = li.xpath("./div\[2\]/text()")\[0\] 7 day\_weather\_info\['high'\] = high\[:high.find('℃')\] 8 # 最低气温 9 low = li.xpath("./div\[3\]/text()")\[0\]10 day\_weather\_info\['low'\] = low\[:low.find('℃')\]11 # 天气12 day\_weather\_info\['weather'\] = li.xpath("./div\[4\]/text()")\[0\]13 weather\_info.append(day\_weather\_info)14 return weather\_info

然后我们便得到了我们所需要的数据

接着爬取我们这个月的天气信息,存入列表中,然一次性写入我们的csv文件中,这样我们就得到了一个存有泉州2022全年天气情况的文件

# for循环生成有顺序的1-12for month in range(1, 13):    # 获取某一月的天气信息    # 三元表达式    weather\_time = '2022' + ('0' + str(month) if month < 10 else str(month))    print(weather\_time)    url \= f'https://lishi.tianqi.com/quanzhou/{weather_time}.html'    # 爬虫获取这个月的天气信息    weather = getWeather(url)    # 存到列表中    weathers.append(weather)print(weathers)# 数据写入(一次性写入)with open("weather.csv", "w",newline='') as csvfile:    writer \= csv.writer(csvfile)    # 先写入列名:columns\_name 日期 最高气温 最低气温  天气    writer.writerow(\["日期", "最高气温", "最低气温", '天气'\])    # 一次写入多行用writerows(写入的数据类型是列表,一个列表对应一行)    writer.writerows(\[list(day\_weather\_dict.values()) for month\_weather in weathers for day\_weather\_dict in month\_weather\])import sqlite3

文件如下:

3.对我们的数据进行一下词云处理

所用到的库

1 import requests2 from lxml import etree3 import csv4 from wordcloud import WordCloud5 import matplotlib.pyplot as plt

然后对数据在进行一次爬取与清理

1 # 从URL获取天气信息的函数 2 def getWeather(url): 3     weather\_info = \[\]  # 存储天气信息的列表 4     headers = { 5         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1' 6     } 7     resp = requests.get(url, headers=headers)  # 发送GET请求到指定的URL 8     resp\_html = etree.HTML(resp.text)  # 解析响应的HTML 9     resp\_list = resp\_html.xpath("//ul\[@class='thrui'\]/li")  # 使用XPath选择器提取天气信息列表10     for li in resp\_list:11         day\_weather\_info = {}  # 存储每天天气信息的字典12         day\_weather\_info\['date\_time'\] = li.xpath("./div\[1\]/text()")\[0\].split(' ')\[0\]  # 提取日期时间并存入字典13         high = li.xpath("./div\[2\]/text()")\[0\]  # 提取最高温度14         day\_weather\_info\['high'\] = high\[:high.find('℃')\]  # 去除温度单位并存入字典15         low = li.xpath("./div\[3\]/text()")\[0\]  # 提取最低温度16         day\_weather\_info\['low'\] = low\[:low.find('℃')\]  # 去除温度单位并存入字典17         day\_weather\_info\['weather'\] = li.xpath("./div\[4\]/text()")\[0\]  # 提取天气情况并存入字典18         weather\_info.append(day\_weather\_info)  # 将每天天气信息字典添加到天气信息列表中19     return weather\_info20 def main():21     weathers = \[\]  # 存储所有月份的天气信息的列表22     for month in range(1, 13):23         weather\_time = '2022' + ('0' + str(month) if month < 10 else str(month))24         print(weather\_time)25         url = f'https://lishi.tianqi.com/quanzhou/{weather_time}.html'26         weather = getWeather(url)27         weathers.append(weather)  # 将每个月份的天气信息添加到weathers列表中28     print(weathers)29 30     weather\_data = ""  # 存储所有天气情况的字符串31     for month\_weather in weathers:32         for day\_weather\_dict in month\_weather:33             weather = day\_weather\_dict\['weather'\]  # 提取天气情况34             weather\_data += weather + " "  # 将天气情况添加到weather\_data字符串中,用空格分隔

然后便得到了我们熟悉的数据

wordcloud的分词可视化处理

1    wordcloud = WordCloud(font\_path='C:\\Windows\\Fonts\\微软雅黑\\msyh.ttc', width=800, height=400, font\_step=1,2                           prefer\_horizontal=0.9).generate(weather\_data)  # 根据天气数据生成词云3     plt.figure(figsize=(10, 5))4     plt.imshow(wordcloud, interpolation='bilinear')  # 显示词云图像5     plt.axis('off')6 plt.show()7 8 if \_\_name\_\_ == '\_\_main\_\_':9     main()

4.数据持久化

import sqlite3def create\_weather\_table():    conn \= sqlite3.connect('weather.db')  # 连接到数据库文件    cursor = conn.cursor()    # 创建天气表格    cursor.execute('''CREATE TABLE IF NOT EXISTS weather (                        date\_time TEXT,                        high TEXT,                        low TEXT,                        weather TEXT                    )''')  # 创建天气表格,如果不存在则创建    conn.commit()  # 提交更改到数据库    conn.close()  # 关闭数据库连接def insert\_weather\_data(weather\_data):    conn \= sqlite3.connect('weather.db')  # 连接到数据库文件    cursor = conn.cursor()    # 插入天气数据    for month\_weather in weather\_data:        for day\_weather\_dict in month\_weather:            date\_time \= day\_weather\_dict\['date\_time'\]  # 获取日期时间            high = day\_weather\_dict\['high'\]  # 获取最高温度            low = day\_weather\_dict\['low'\]  # 获取最低温度            weather = day\_weather\_dict\['weather'\]  # 获取天气情况            cursor.execute("INSERT INTO weather VALUES (?, ?, ?, ?)", (date\_time, high, low, weather))  # 插入数据到天气表格    conn.commit()  # 提交更改到数据库    conn.close()  # 关闭数据库连接def main():    create\_weather\_table()  # 创建天气表格    weathers \= \[\]  # 存储所有月份的天气信息的列表    for month in range(1, 13):        weather\_time \= '2022' + ('0' + str(month) if month < 10 else str(month))        print(weather\_time)        url \= f'https://lishi.tianqi.com/quanzhou/{weather_time}.html'        weather \= getWeather(url)  # 获取天气信息weathers.append(weather)print(weathers)insert\_weather\_data(weathers)if \_\_name\_\_ == '\_\_main\_\_':    main()

然后数据便以库文件的方式存入电脑中

5.数据可视化

所用到的库

1 import pandas as pd2 from pyecharts import options as opts3 from pyecharts.charts import Pie, Bar, Timeline, Line, Scatter

使用pandas.read_csv()读取我们数据文件

1 df = pd.read_csv(‘weather.csv’,encoding=‘gb18030’)

因为绘制的图形是动态的天气轮播图,而此时我们日期的数据类型为字符串,要将类型改为datetime

1 df[‘日期’] = df[‘日期’].apply(lambda x: pd.to_datetime(x))

使用GroupBy聚合对象 以及size().reset_index()方法来将每种天气出现的次数等数据进行分组,统计。

遍历方法:contents: 返回当前节点的直接子节点列表。

1 df\_agg = df.groupby(\['month','天气'\]).size().reset\_index()2 print(df\_agg)

对每列数据进行一个命名

df\_agg.columns = \['month','tianqi','count'\]print(df\_agg)

将数据转化为列表数据

1 print(df\_agg\[df\_agg\['month'\]==1\]\[\['tianqi','count'\]\]\\2     .sort\_values(by='count',ascending=False).values.tolist())

将处理好的数据传入图表中,绘制横放柱状轮播图

1 # 画图 2 # 实例化一个时间序列的对象 3 timeline = Timeline() 4 # 播放参数:设置时间间隔 1s  单位是:ms(毫秒) 5 timeline.add\_schema(play\_interval=1000)    # 单位是:ms(毫秒) 6  7 # 循环遍历df\_agg\['month'\]里的唯一值 8 for month in df\_agg\['month'\].unique(): 9     data = (10 11         df\_agg\[df\_agg\['month'\]==month\]\[\['tianqi','count'\]\]12         .sort\_values(by='count',ascending=True)13 .values.tolist()14 )15     # print(data)16     # 绘制柱状图17     bar = Bar()18     # x轴是天气名称19     bar.add\_xaxis(\[x\[0\] for x in data\])20     # y轴是出现次数21     bar.add\_yaxis('',\[x\[1\] for x in data\])22 23     # 让柱状图横着放24 bar.reversal\_axis()25     # 将计数标签放置在图形右边26     bar.set\_series\_opts(label\_opts=opts.LabelOpts(position='right'))27     # 设置下图表的名称28     bar.set\_global\_opts(title\_opts=opts.TitleOpts(title='泉州2022年每月天气变化 '))29     # 将设置好的bar对象放置到时间轮播图当中,并且标签选择月份 格式为: 数字月30     timeline.add(bar, f'{month}月')31 32 # 将设置好的图表保存为'weathers.html'文件33 timeline.render('weathers1.html')

#由于视频上传不了,所以只放了两个月份的天气数据图片

绘制折线图

1 # 画图 2 # 实例化一个时间序列的对象 3 timeline = Timeline() 4 # 播放参数:设置时间间隔 1s 单位是:ms(毫秒) 5 timeline.add\_schema(play\_interval=1000)  # 单位是:ms(毫秒) 6  7 # 循环遍历df\_agg\['tianqi'\]里的唯一值(天气类型) 8 for tianqi in df\_agg\['tianqi'\].unique(): 9     data = (10         df\_agg\[df\_agg\['tianqi'\] == tianqi\]\[\['month', 'count'\]\]11         .sort\_values(by='month', ascending=True)12 .values.tolist()13 )14     # print(data)15     # 绘制折线图16     line = Line()17     # x轴是月份18     line.add\_xaxis(\[x\[0\] for x in data\])19     # y轴是出现次数20     line.add\_yaxis(tianqi, \[x\[1\] for x in data\], is\_smooth=True)21 22     # 设置图线平滑曲线23 line.set\_series\_opts(24         markpoint\_opts=opts.MarkPointOpts(25             data=\[opts.MarkPointItem(type\_="max", name="最大值")\]26 )27 )28 29     # 设置下图表的名称30 line.set\_global\_opts(31         title\_opts=opts.TitleOpts(title='泉州2022年天气趋势'),32         datazoom\_opts=opts.DataZoomOpts(type\_="slider", range\_start=0, range\_end=100),33 )34 35     # 将设置好的line对象放置到时间轮播图中,并且标签选择天气类型36 timeline.add(line, tianqi)37 38 # 将设置好的时间轮播图渲染为HTML文件39 timeline.render("weather\_trend.html")

绘制散点图

1 # 画图 2 # 实例化一个散点图对象 3 scatter = Scatter() 4 # 播放参数:设置时间间隔 1s 单位是:ms(毫秒) 5 timeline.add\_schema(play\_interval=1000) # 单位是:ms(毫秒) 6  7 # 循环遍历df\_agg\['month'\]里的唯一值 8 for month in df\_agg\['month'\].unique(): 9     data = (10         df\_agg\[df\_agg\['month'\]==month\]\[\['tianqi','count'\]\]11         .sort\_values(by='count',ascending=True)12 .values.tolist()13 )14     # 绘制散点图15     scatter = Scatter()16     # x轴是天气名称17     scatter.add\_xaxis(\[x\[0\] for x in data\])18     # y轴是出现次数19     scatter.add\_yaxis('',\[x\[1\] for x in data\])20 21     # 设置下图表的名称22     scatter.set\_global\_opts(title\_opts=opts.TitleOpts(title=f'{month}月天气散点图'))23 24     # 将设置好的scatter对象放置到时间轮播图当中,并且标签选择月份 格式为: 数字月25     timeline.add(scatter, f'{month}月')26 27 # 将设置好的时间轮播图渲染为html文件28 timeline.render('scatter\_timeline.html')

根据以上几个可视化图形可知

泉州市的降雨集中在5月至9月期间,而晴天比较多的月份是10月至来年3月。主题页面的结构与特征分析

1.主题页面的结构与特征分析

目标内容界面:

2. Htmls 页面解析

3.节点查找方法与遍历方法

查找方法:find(): 查找第一个匹配到的节点。

6.将以上各部分的代码汇总,附上完整程序代码

(1)数据爬取与清洗,以及持久化部分

1 #\-\*- coding: utf-8 -\*-  2 import requests  # 模拟浏览器进行网络请求  3 from lxml import etree  # 进行数据预处理  4 import csv  # 写入csv文件  5 import sqlite3  6 def getWeather(url):  7     weather\_info = \[\]   # 新建一个列表,将爬取的每月数据放进去  8     # 请求头信息:浏览器版本型号,接收数据的编码格式  9     headers = { 10         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1' 11     } 12     # 请求 接收到了响应数据 13     resp = requests.get(url, headers=headers) 14     # 数据预处理s 15     resp\_html = etree.HTML(resp.text) 16     # xpath提取所有数据 17     resp\_list = resp\_html.xpath("//ul\[@class='thrui'\]/li") 18     # for循环迭代遍历 19     for li in resp\_list: 20         day\_weather\_info = {} 21         # 日期 22         day\_weather\_info\['date\_time'\] = li.xpath("./div\[1\]/text()")\[0\].split(' ')\[0\] 23         # 最高气温 (包含摄氏度符号) 24         high = li.xpath("./div\[2\]/text()")\[0\] 25         day\_weather\_info\['high'\] = high\[:high.find('℃')\] 26         # 最低气温 27         low = li.xpath("./div\[3\]/text()")\[0\] 28         day\_weather\_info\['low'\] = low\[:low.find('℃')\] 29         # 天气 30         day\_weather\_info\['weather'\] = li.xpath("./div\[4\]/text()")\[0\] 31         weather\_info.append(day\_weather\_info) 32     return weather\_info 33  34 weathers = \[\] 35  36 # for循环生成有顺序的1-12 37 for month in range(1, 13): 38     # 获取某一月的天气信息 39     # 三元表达式 40     weather\_time = '2022' + ('0' + str(month) if month < 10 else str(month)) 41     print(weather\_time) 42     url = f'https://lishi.tianqi.com/quanzhou/{weather_time}.html' 43     # 爬虫获取这个月的天气信息 44     weather = getWeather(url) 45     # 存到列表中 46     weathers.append(weather) 47 print(weathers) 48  49  50 # 数据写入(一次性写入) 51 with open("weather.csv", "w",newline='') as csvfile: 52     writer = csv.writer(csvfile) 53     # 先写入列名:columns\_name 日期 最高气温 最低气温  天气 54     writer.writerow(\["日期", "最高气温", "最低气温", '天气'\]) 55     # 一次写入多行用writerows(写入的数据类型是列表,一个列表对应一行) 56     writer.writerows(\[list(day\_weather\_dict.values()) for month\_weather in weathers for day\_weather\_dict in month\_weather\]) 57  58  59 import sqlite3 60  61  62 def create\_weather\_table(): 63     conn = sqlite3.connect('weather.db')  # 连接到数据库文件 64     cursor = conn.cursor() 65  66     # 创建天气表格 67     cursor.execute('''CREATE TABLE IF NOT EXISTS weather ( 68                         date\_time TEXT, 69                         high TEXT, 70                         low TEXT, 71                         weather TEXT 72                     )''')  # 创建天气表格,如果不存在则创建 73  74     conn.commit()  # 提交更改到数据库 75     conn.close()  # 关闭数据库连接 76  77  78 def insert\_weather\_data(weather\_data): 79     conn = sqlite3.connect('weather.db')  # 连接到数据库文件 80     cursor = conn.cursor() 81  82     # 插入天气数据 83     for month\_weather in weather\_data: 84         for day\_weather\_dict in month\_weather: 85             date\_time = day\_weather\_dict\['date\_time'\]  # 获取日期时间 86             high = day\_weather\_dict\['high'\]  # 获取最高温度 87             low = day\_weather\_dict\['low'\]  # 获取最低温度 88             weather = day\_weather\_dict\['weather'\]  # 获取天气情况 89  90             cursor.execute("INSERT INTO weather VALUES (?, ?, ?, ?)", (date\_time, high, low, weather))  # 插入数据到天气表格 91  92     conn.commit()  # 提交更改到数据库 93     conn.close()  # 关闭数据库连接 94  95  96 def main(): 97     create\_weather\_table()  # 创建天气表格 98  99     weathers = \[\]  # 存储所有月份的天气信息的列表100     for month in range(1, 13):101         weather\_time = '2022' + ('0' + str(month) if month < 10 else str(month))102         print(weather\_time)103         url = f'https://lishi.tianqi.com/quanzhou/{weather_time}.html'104         weather = getWeather(url)  # 获取天气信息105 106 107 weathers.append(weather)108 print(weathers)109 110 insert\_weather\_data(weathers)111 112 if \_\_name\_\_ == '\_\_main\_\_':113     main()

(2)数据可视化部分

1 #\-\*- coding: utf-8 -\*-  2   3 # 数据分析 读取 处理 存储  4 import pandas as pd  5 from pyecharts import options as opts  6 from pyecharts.charts import Pie, Bar, Timeline, Line, Scatter  7   8 # 用pandas.read\_csv()读取指定的excel文件,选择编码格式gb18030(gb18030范围比)  9 df = pd.read\_csv('weather.csv',encoding='gb18030') 10 print(df\['日期'\]) 11  12 # 将日期格式的数据类型改为month 13 df\['日期'\] = df\['日期'\].apply(lambda x: pd.to\_datetime(x)) 14 print(df\['日期'\]) 15  16  17 # 新建一列月份数据(将日期中的月份month 一项单独拿取出来) 18 df\['month'\] = df\['日期'\].dt.month 19  20 print(df\['month'\]) 21 # 需要的数据 每个月中每种天气出现的次数 22  23 # DataFrame GroupBy聚合对象 分组和统计的  size()能够计算分组的大小 24 df\_agg = df.groupby(\['month','天气'\]).size().reset\_index() 25 print(df\_agg) 26  27 # 设置下这3列的列名 28 df\_agg.columns = \['month','tianqi','count'\] 29 print(df\_agg) 30  31 # 转化为列表数据 32 print(df\_agg\[df\_agg\['month'\]==1\]\[\['tianqi','count'\]\]\\ 33     .sort\_values(by='count',ascending=False).values.tolist()) 34 """ 35 \[\['阴', 20\], \['多云', 5\], \['雨夹雪', 4\], \['晴', 2\]\] 36 """ 37  38 # 画图 39 # 实例化一个时间序列的对象 40 timeline = Timeline() 41 # 播放参数:设置时间间隔 1s  单位是:ms(毫秒) 42 timeline.add\_schema(play\_interval=1000)    # 单位是:ms(毫秒) 43  44 # 循环遍历df\_agg\['month'\]里的唯一值 45 for month in df\_agg\['month'\].unique(): 46     data = ( 47  48         df\_agg\[df\_agg\['month'\]==month\]\[\['tianqi','count'\]\] 49         .sort\_values(by='count',ascending=True) 50         .values.tolist() 51     ) 52     # print(data) 53     # 绘制柱状图 54     bar = Bar() 55     # x轴是天气名称 56     bar.add\_xaxis(\[x\[0\] for x in data\]) 57     # y轴是出现次数 58     bar.add\_yaxis('',\[x\[1\] for x in data\]) 59  60     # 让柱状图横着放 61     bar.reversal\_axis() 62     # 将计数标签放置在图形右边 63     bar.set\_series\_opts(label\_opts=opts.LabelOpts(position='right')) 64     # 设置下图表的名称 65     bar.set\_global\_opts(title\_opts=opts.TitleOpts(title='泉州2022年每月天气变化 ')) 66     # 将设置好的bar对象放置到时间轮播图当中,并且标签选择月份 格式为: 数字月 67     timeline.add(bar, f'{month}月') 68  69 # 将设置好的图表保存为'weathers.html'文件 70 timeline.render('weathers1.html') 71  72  73 # 画图 74 # 实例化一个时间序列的对象 75 timeline = Timeline() 76 # 播放参数:设置时间间隔 1s 单位是:ms(毫秒) 77 timeline.add\_schema(play\_interval=1000)  # 单位是:ms(毫秒) 78  79 # 循环遍历df\_agg\['tianqi'\]里的唯一值(天气类型) 80 for tianqi in df\_agg\['tianqi'\].unique(): 81     data = ( 82         df\_agg\[df\_agg\['tianqi'\] == tianqi\]\[\['month', 'count'\]\] 83         .sort\_values(by='month', ascending=True) 84         .values.tolist() 85     ) 86     # print(data) 87     # 绘制折线图 88     line = Line() 89     # x轴是月份 90     line.add\_xaxis(\[x\[0\] for x in data\]) 91     # y轴是出现次数 92     line.add\_yaxis(tianqi, \[x\[1\] for x in data\], is\_smooth=True) 93  94     # 设置图线平滑曲线 95     line.set\_series\_opts( 96         markpoint\_opts=opts.MarkPointOpts( 97             data=\[opts.MarkPointItem(type\_="max", name="最大值")\] 98         ) 99 )100 101     # 设置下图表的名称102 line.set\_global\_opts(103         title\_opts=opts.TitleOpts(title='泉州2022年天气趋势'),104         datazoom\_opts=opts.DataZoomOpts(type\_="slider", range\_start=0, range\_end=100),105 )106 107     # 将设置好的line对象放置到时间轮播图中,并且标签选择天气类型108 timeline.add(line, tianqi)109 110 # 将设置好的时间轮播图渲染为HTML文件111 timeline.render("weather\_trend.html")112 113 # 画图114 # 实例化一个散点图对象115 scatter = Scatter()116 # 播放参数:设置时间间隔 1s 单位是:ms(毫秒)117 timeline.add\_schema(play\_interval=1000) # 单位是:ms(毫秒)118 119 # 循环遍历df\_agg\['month'\]里的唯一值120 for month in df\_agg\['month'\].unique():121     data = (122         df\_agg\[df\_agg\['month'\]==month\]\[\['tianqi','count'\]\]123         .sort\_values(by='count',ascending=True)124 .values.tolist()125 )126     # 绘制散点图127     scatter = Scatter()128     # x轴是天气名称129     scatter.add\_xaxis(\[x\[0\] for x in data\])130     # y轴是出现次数131     scatter.add\_yaxis('',\[x\[1\] for x in data\])132 133     # 设置下图表的名称134     scatter.set\_global\_opts(title\_opts=opts.TitleOpts(title=f'{month}月天气散点图'))135 136     # 将设置好的scatter对象放置到时间轮播图当中,并且标签选择月份 格式为: 数字月137     timeline.add(scatter, f'{month}月')138 139 # 将设置好的时间轮播图渲染为html文件140 timeline.render('scatter\_timeline.html')141 import numpy as np142 from sklearn.linear\_model import LinearRegression

(3)wordcloud分词可视化,词云部分

1  1 # -\*- coding: utf-8 -\*- 2  2  3  3 # 导入必要的库 4  4 import requests 5  5 from lxml import etree 6  6 import csv 7  7 from wordcloud import WordCloud 8  8 import matplotlib.pyplot as plt 9  9 10 10 # 从URL获取天气信息的函数s11 11 def getWeather(url):12 12     weather\_info = \[\]  # 存储天气信息的列表13 13     headers = {14 14         'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64) AppleWebKit/535.1 (KHTML, like Gecko) Chrome/14.0.835.163 Safari/535.1'15 15}16 16     resp = requests.get(url, headers=headers)  # 发送GET请求到指定的URL17 17     resp\_html = etree.HTML(resp.text)  # 解析响应的HTML18 18     resp\_list = resp\_html.xpath("//ul\[@class='thrui'\]/li")  # 使用XPath选择器提取天气信息列表19 19     for li in resp\_list:20 20         day\_weather\_info = {}  # 存储每天天气信息的字典21 21         day\_weather\_info\['date\_time'\] = li.xpath("./div\[1\]/text()")\[0\].split(' ')\[0\]  # 提取日期时间并存入字典22 22         high = li.xpath("./div\[2\]/text()")\[0\]  # 提取最高温度23 23         day\_weather\_info\['high'\] = high\[:high.find('℃')\]  # 去除温度单位并存入字典24 24         low = li.xpath("./div\[3\]/text()")\[0\]  # 提取最低温度25 25         day\_weather\_info\['low'\] = low\[:low.find('℃')\]  # 去除温度单位并存入字典26 26         day\_weather\_info\['weather'\] = li.xpath("./div\[4\]/text()")\[0\]  # 提取天气情况并存入字典27 27         weather\_info.append(day\_weather\_info)  # 将每天天气信息字典添加到天气信息列表中28 28     return weather\_info29 29 def main():30 30     weathers = \[\]  # 存储所有月份的天气信息的列表31 31     for month in range(1, 13):32 32         weather\_time = '2022' + ('0' + str(month) if month < 10 else str(month))33 33         print(weather\_time)34 34         url = f'https://lishi.tianqi.com/quanzhou/{weather_time}.html'35 35         weather = getWeather(url)36 36         weathers.append(weather)  # 将每个月份的天气信息添加到weathers列表中37 37     print(weathers)38 38 39 39     weather\_data = ""  # 存储所有天气情况的字符串40 40     for month\_weather in weathers:41 41         for day\_weather\_dict in month\_weather:42 42             weather = day\_weather\_dict\['weather'\]  # 提取天气情况43 43             weather\_data += weather + " "  # 将天气情况添加到weather\_data字符串中,用空格分隔44 44 45 45     wordcloud = WordCloud(font\_path='C:\\Windows\\Fonts\\微软雅黑\\msyh.ttc', width=800, height=400, font\_step=1,46 46                           prefer\_horizontal=0.9).generate(weather\_data)  # 根据天气数据生成词云47 47     plt.figure(figsize=(10, 5))48 48     plt.imshow(wordcloud, interpolation='bilinear')  # 显示词云图像49 49     plt.axis('off')50 50     plt.show()51 51 52 52 if \_\_name\_\_ == '\_\_main\_\_':53 53     main()

在这里插入图片描述

children: 返回当前节点的直接子节点的迭代器。