猿问

请问在python中sgmllib.SGMLParser有什么作用?

麻烦讲具体点,新手,谢谢

回首忆惘然
浏览 153回答 2
2回答

慕森卡

如果要用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函数给你个例子你就知道了:#------------------&nbsp;HTMLParser_stack.py&nbsp;------------------##--&nbsp;coding:&nbsp;GBK&nbsp;--import&nbsp;sgmllib,sys,os,stringhtml&nbsp;=&nbsp;"""<lala><head><title>Advice</title></head><body><p>The&nbsp;<a&nbsp;href="http://ietf.org"&nbsp;mce_href="http://ietf.org">IETF&nbsp;admonishes:<i>Be&nbsp;strict&nbsp;in&nbsp;what&nbsp;you&nbsp;<b>send</b>.</i></a></p><form><input&nbsp;type=submit&nbsp;name='我'>&nbsp;我&nbsp;<input&nbsp;type=text&nbsp;name=start&nbsp;size=4></form></body></lala>"""&nbsp;os.chdir('d://python')f=file('testboard.txt','r')contest=f.read()tagstack&nbsp;=&nbsp;[]class&nbsp;ShowStructure(sgmllib.SGMLParser):&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;handle_starttag(self,&nbsp;tag,&nbsp;method,attrs):&nbsp;tagstack.append(tag)&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;handle_endtag(self,&nbsp;tag):&nbsp;tagstack.pop()&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;handle_data(self,&nbsp;data):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;if&nbsp;data.strip():&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;for&nbsp;tag&nbsp;in&nbsp;tagstack:&nbsp;sys.stdout.write('/'+tag)&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;sys.stdout.write('&nbsp;>>&nbsp;%s/n'&nbsp;%&nbsp;data[:40].strip())&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;unknown_starttag(self,tag,attrs):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'start&nbsp;tag:<'+tag+'>'&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;unknown_endtag(self,tag):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'end&nbsp;tag:</'+tag+'>'&nbsp;&nbsp;&nbsp;&nbsp;def&nbsp;start_lala(self,attr):&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;print&nbsp;'lala&nbsp;tag&nbsp;found'ShowStructure().feed(html)&nbsp;输出: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>

繁华开满天机

这个是好东西。是用SGML做解析的。 SGML是XML的前身。 用这个解析器也可以解析标准的html。曾经将这个解析器改造后变成一个HTML的畸形校正器。它是一个比较单纯的用正则表达式依次解析XML的一个解析器。效率不是很高。解析后的结果,你可以根据自己的需要将它放在树里,或者是数组里都可以。
随时随地看视频慕课网APP

相关分类

Python
我要回答