为了账号安全,请及时绑定邮箱和手机立即绑定

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

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

回首忆惘然 2022-03-10 11:07:46
麻烦讲具体点,新手,谢谢
查看完整描述

2 回答

?
慕森卡

TA贡献1806条经验 获得超8个赞

如果要用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 >> Advice
end tag:</title>
end tag:</head>
start tag:<body>
start tag:<p>
/lala >> The
start tag:<a>
/lala >> IETF admonishes:
start tag:<i>
/lala >> Be strict in what you
start tag:<b>
/lala >> send
end 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>



查看完整回答
反对 回复 2022-03-15
?
繁华开满天机

TA贡献1816条经验 获得超4个赞

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

查看完整回答
反对 回复 2022-03-15
  • 2 回答
  • 0 关注
  • 152 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信