本篇主要对HTMLParser练习题目给出第二种方法解答,第一种详细见上篇。《python笔记:常用内建模块—HTMLParser(细节补充)》https://blog.csdn.net/zyckhuntoria/article/details/81056346,主要方法是首先利用handle_starttag()函数寻找标签,当遇到要寻找的标签,将变量self.ttag根据不同标签赋予不同的值,利用handle_data()根据self.ttag的值,对标签中的数据进行分类处理。
一二种方法的主要流程都是如此,但是第一种方法中handle_data()是直接将数据进行输出。第二种方法,我们在handle_data()中将数据存入dict中,再利用循环将dict中的数据进行输出。
下面上第二种方法
题目:
代码:
from html.parser import HTMLParser
from html.entities import name2codepoint
from urllib import request
import re
from html.entities import name2codepoint
class MyHTMLParser(HTMLParser):
res=[]
#注意将存储数据的dict型变量放在__init__()外,因为接下来要在类MYHTMLParser外部使用res[],否则无法使用
def __init__(self):
HTMLParser.__init__(self)
self.time=""
self.ttag=""
self.flag=0
def handle_starttag(self, tag, attrs):
self.ttag=tag
try: #注意添加try except 抛出异常,否则attrs[0][1]处会出现错误:IndexError
if self.ttag=="h3" and attrs[0][1]=="event-title":
self.flag=1
if self.flag==1 and tag=="a" and "events/python-events/" in attrs[0][1]:
self.ttag="title"
if self.ttag=="span" and attrs[0][1]=="event-location":
self.ttag="addr"
except IndexError:
pass
def handle_endtag(self,tag): #注意要在标签结束的时候对值进行还原,否则会出现data值存储错误
if self.flag == 1 and tag == 'h3':
self.flag = 0
if tag =="span" or tag=="p":
self.ttag =""
def handle_data(self, data):
if self.ttag=="title" and self.flag==1:#如果
self.res.append({"会议主题":data})
elif self.ttag=="time":
self.res[len(self.res) - 1]["会议时间"] = data
elif self.ttag=="addr":
print("shuzhishi:",data,self.tagcp)
self.res[len(self.res) - 1]["会议地点"] = data
url = 'https://www.python.org/events/python-events/'
try:
with request.urlopen(url) as f:
data = f.read().decode('utf-8')
except HTTPError:
print('Error getting page source')
parse = MyHTMLParser()
parse.feed(data)
for item in MyHTMLParser.res:
print('---------------')
for k,v in item.items():
print("%s : %s" % (k,v))
运行: