python笔记:常用内建模块—HTMLParser(习题)

    本篇主要对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))

运行:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值