通过HTMLPaser和urlib模块对网页进行抓取并分析
实现步骤:
1、自定义MYHTMLParser类
2、实例化类并访问天气预报官网
3、抓取关键数据
4、对数据进行切片处理并输出字典
from html.parser import HTMLPaser #处理页面模块
from urllib import request #访问网站模块
L = [] #定义列表接受抓取的信息
class MYHTMLPaser(HTMLParser): #自定义MYHTMLParser类重写方法
#定义三个函数
#handle_starttag:处理开始标签 attrs:标签属性 tag:标签
a_t = False #定义a_t变量为提出标签内容时的判断做准备
def handle_starttag(self,tag,attrs):
if tag == "h1" and len(attrs) == 0: #找出不带属性的h1标签
self.a_t = True
else tag == "p" and len(attrs) > 1: #找出属性大于1的p标签
self.a_t = True
#handle_data:处理标签内容 data:标签内容
def handle_data(self,data):
if self.a_t ==True: #取出h1标签p标签的内容并添加到L列表中
L.append(data)
#handle_endtag:处理结束标签
def handle_endtag(self,tag):
self.a_t = False #一个标签读取完成后恢复a_t变量为下一个标签的读取判断做准备
#自定义类实例化
p = MYHTMLParser()
#访问天气预报官网
with request.urlopen("http://www.weather.com.cn/weather/101010100.shtml") as f:
data = f.read().decode('utf-8') #读取网页数据
#解析网页信息查找未来七天的天气情况并输出到列表中
p.feed(str(data))
p.close() #关闭资源
#对列表进行操作输出字典
L1 = list(list(L)[2:-6])[1:][::2]
L2 = list(list(L)[2:-6])[::2]
weather = dict(zip(L2,L1))
#输出天气
print(weather)
输出结果如下图:
源码如下:
# 本模块对一周天气情况进行爬虫
fromhtml.parserimportHTMLParser
fromurllibimportrequest
importre
# 自定义MYHTMLParser类
L = []
classMYHTMLParser(HTMLParser):
a_t =False
def handle_starttag(self,tag,attrs):
if tag =="h1"andlen(attrs) ==0:
self.a_t =True
elif tag =="p"andlen(attrs) >1:
self.a_t =True
def handle_data(self,data):
ifself.a_t ==True:
L.append(data)
def handle_endtag(self,tag):
self.a_t =False
# 自自定义类实例化
p = MYHTMLParser()
# 访问天气预报官网
withrequest.urlopen("http://www.weather.com.cn/weather/101010100.shtml")asf:
data = f.read().decode('utf-8')
# 解析网页输出关键信息
p.feed(str(data))
p.close()
# 转成字典
L1 =list(list(L)[2:-6])[1:][::2]
L2 =list(list(L)[2:-6])[::2]
weather =dict(zip(L2,L1))
print(weather)