慕森卡
如果要用sgmllib解析html,则要继承sgmllib.SGMLParser类,此类里的函数都是空的,用户需要重载它。这个类提供的功能是在特定情况下调用相应的函数。比如当发现<html>标签时,如果并没有定义 start_html(self,attr)函数,则会调用unknown_starttag函数,具体怎么处理则根据用户。sgml的标签是可以自定义的,比如自己定义了一个start_lala函数,则就会处理<lala>标签。有个地方要说明下,如果定义了start_tagname函数,有定义了handle_starttag函数,则函数只会运行handle_starttag函数,start_tagname为空函数都没有问题,如果没有定义handle_starttag函数,则遇到<tagname>标签时,会运行start_tagname函数。如果没有定义tagname的start函数,则此标签为未知标签,调用unknown_starttag函数给你个例子你就知道了:#------------------ HTMLParser_stack.py ------------------##-- coding: GBK --import sgmllib,sys,os,stringhtml = """<lala><head><title>Advice</title></head><body><p>The <a href="http://ietf.org" mce_href="http://ietf.org">IETF admonishes:<i>Be strict in what you <b>send</b>.</i></a></p><form><input type=submit name='我'> 我 <input type=text name=start size=4></form></body></lala>""" os.chdir('d://python')f=file('testboard.txt','r')contest=f.read()tagstack = []class ShowStructure(sgmllib.SGMLParser): def handle_starttag(self, tag, method,attrs): tagstack.append(tag) def handle_endtag(self, tag): tagstack.pop() def handle_data(self, data): if data.strip(): for tag in tagstack: sys.stdout.write('/'+tag) sys.stdout.write(' >> %s/n' % data[:40].strip()) def unknown_starttag(self,tag,attrs): print 'start tag:<'+tag+'>' def unknown_endtag(self,tag): print 'end tag:</'+tag+'>' def start_lala(self,attr): print 'lala tag found'ShowStructure().feed(html) 输出:start tag:<head>start tag:<title>/lala >> Adviceend tag:</title>end tag:</head>start tag:<body>start tag:<p>/lala >> Thestart tag:<a>/lala >> IETF admonishes:start tag:<i>/lala >> Be strict in what youstart tag:<b>/lala >> sendend tag:</b>/lala >> .end tag:</i>end tag:</a>end tag:</p>start tag:<form>start tag:<input>/lala >> ϒstart tag:<input>end tag:</form>end tag:</body>end tag:</lala>