|
|
上一次发现了SGMLParser的bug,(见Python sgmlparser bug)于是就想到了利用HTMLParser,于是对其利用同样的HTML代码做了测试:
测试代码如下:
class postparser(HTMLParser): def __init__(self): HTMLParser.__init__(self) self.pieces=[] def handle_starttag(self, tag, attrs): print "start tag name: " + tag for k,v in attrs: print "\t"+k+" : "+v def handle_endtag(self,tag): print "end tag name:"+tag def handle_data(self,data): self.pieces.append(data) def gethtmltext(self): return "".join(self.pieces) def reset(self): HTMLParser.reset(self) def testmyparser(htmldata): parser=postparser() parser.feed(htmldata) print parser.gethtmltext() parser.reset() if __name__=="__main__": #htmldata=urllib.urlopen("http://www.sogou.com").read().decode("gbk") htmldata="""<html><head> <title>Google Page</title> <meta http-equiv="Content-Type" content="text/html; charset=utf-8"> <link rel="stylesheet" href="#" type="text/css"> </head><body> <table id="tab"> <tr id="tr1"><td id="tr1td1">tr1 td1</td><td>tr1 td2</td><td>tr1 td3</td></tr> <tr id="tr2"><td id="tr2td1">tr2 td1</td><td>tr2 td2</td><td>tr2 td3</td></tr> </table> <br/> <p onmousemove="javascript:alert('>p<');"> this is a paragraph.</p> <img src="http://www.baidu.com/img/baidu_logo.gif" id="baidulogo" /><br/> <a href="http://baidu.com">baidu</a><br/> <b>bold font</b><br/> <script language="javascript">alert("hello, world ");</script> <style>#tab{background-color:#fcdad5;}</style> </body></html> """ testmyparser(htmldata)
结果输出如下:
start tag name: htmlstart tag name: headstart tag name: titleend tag name:titlestart tag name: metahttp-equiv : Content-Typecontent : text/html; charset=utf-8start tag name: linkrel : stylesheethref : #type : text/cssend tag name:headstart tag name: bodystart tag name: tableid : tabstart tag name: trid : tr1start tag name: tdid : tr1td1end tag name:tdstart tag name: tdend tag name:tdstart tag name: tdend tag name:tdend tag name:trstart tag name: trid : tr2start tag name: tdid : tr2td1end tag name:tdstart tag name: tdend tag name:tdstart tag name: tdend tag name:tdend tag name:trend tag name:tablestart tag name: brend tag name:brstart tag name: ponmousemove : javascript:alert('>p<');end tag name:pstart tag name: imgsrc : http://www.baidu.com/img/baidu_logo.gifid : baidulogoend tag name:imgstart tag name: brend tag name:brstart tag name: ahref : http://baidu.comend tag name:astart tag name: brend tag name:brstart tag name: bend tag name:bstart tag name: brend tag name:brstart tag name: scriptlanguage : javascriptend tag name:scriptstart tag name: styleend tag name:styleend tag name:bodyend tag name:html Google Page tr1 td1tr1 td2tr1 td3 tr2 td1tr2 td2tr2 td3 this is a paragraph. baidu bold font alert("hello, world "); #tab{background-color:#fcdad5;}
从测试结果来看,比之于SGMLParser,解析的结果还是不错的,克服了不能解析单个标签的bug,而且onmousemove中的><也得到了正确的解析。
|
|