六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 134|回复: 0

htmlparser vs sgmlparser 解析html的单个标签br img

[复制链接]

升级  22.67%

22

主题

22

主题

22

主题

秀才

Rank: 2

积分
84
 楼主| 发表于 2013-2-7 19:19:26 | 显示全部楼层 |阅读模式
上一次发现了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中的><也得到了正确的解析。
 
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表