使用HTMLParser的疑惑。
感觉现在用HTMLParser的人已经不多了,今天在网上搜了下,官方文档已经下线了。就说我找到一些理解。
HTMLParser必须被继承使用以及各方法的含义,这里不赘述,请百度。
首先看一个实例。
from HTMLParser import HTMLParser
class MyHTMLParser(HTMLParser):
def __init__(self): HTMLParser.__init__(self)
def handle_starttag(self, tag, attrs):print ( " Encountered a start tag: " , tag) def handle_endtag(self, tag): print ( " Encountered an end tag : " , tag) def handle_data(self, data): print ( " Encountered some data : " , data) def handle_startendtag(self, tag, attrs): print ( " Encountered startendtag : " , tag) def handle_comment(self,data): print ( " Encountered comment : " , data)parser = MyHTMLParser()parser.feed( ' <html><head><title>Test</title></head> ' ' <body><h1>Parse me!</h1><img src = "" /> '
'<!-- comment --></body></html>')
执行以上代码,输出结果为:
('Encountered a start tag:', 'html')
('Encountered a start tag:', 'head')
('Encountered a start tag:', 'title')
('Encountered some data :', 'Test')
('Encountered an end tag :', 'title')
('Encountered an end tag :', 'head')
('Encountered a start tag:', 'body')
('Encountered a start tag:', 'h1')
('Encountered some data :', 'Parse me!')
('Encountered an end tag :', 'h1')
('Encountered startendtag :', 'img')
('Encountered comment :', ' comment ')
('Encountered an end tag :', 'body')
('Encountered an end tag :', 'html')
可看出,HTMLParser解释器是根据feed方法输入的文本,执行到什么标签,就去调用哪个方法的。是按照顺序从头到尾解析输入的网页内容。
但是要通过标签名来输出内容的时候怎么办呢?
比如我要通过<a href="www.baidu.com">baidu.com</a>
此时在handle_starttag()方法里设置一个flag
def __init__(self): HTMLParser.__init__(self) self.in_div = False def handle_starttag(self, tag, attrs): if tag == 'div': self.in_div = True def handle_data(self, data): if self.in_div == True and self.lasttag == 'p': print("Encountered p data :", data)
这样就可以实现目的。
但是还是很不方便。
现在都在用beautifullsoup,要好用很多。