#小练习 SGMLParser练习 分类: HTMLParser 2013-11-12 15:50 456人阅读 评论(0) 收藏

SGMLParser 将 HTML 分解成有用的片段, 比如开始标记和结束标记。一旦它成功地分解出某个数据为一个有用的片段,它会根据 所发现的数据,调用一个自身内部的方法。为了使用这个分析器,您需要子类化 SGML- Parser类,并且覆盖这些方法。

SGMLParser类里面包含了很多内部方法,开始读取html后,遇到相应的数据就会调用其对应的方法,最重要的方法有三个:

  • start_tagname(self, attrs)
  • end_tagname(self)
  • handle_data(self, text)
#coding:utf-8

from sgmllib import SGMLParser
class myhp(SGMLParser):

    def reset(self):
        self.l=[]
        self.getdata=False
        self.flag=False

        SGMLParser.reset(self)
    def start_div(self,attrs):
        for k,v in attrs:
            if k=='class' and v=='entry-content':#进入div,设置flag=True
                self.flag=True
    def start_p(self,attrs):
        self.getdata=True #进入<p>,设置getdata=True
    def end_p(self):
        self.getdata=False

    def handle_data(self,data):
        if self.flag and self.getdata:#获取<div><p>标签的数据
            self.l.append(data)
            print data.decode("utf-8")

    def end_div(self):
        self.flag=False

if __name__ == '__main__':
    
    the_page ='''<html>
    <head>
    <title>test</title>
    </head>
    <body>
    <h1>title</h1>
    <div class='entry-content'>

    <p>感兴趣内容1</p>
    <p>感兴趣内容2</p>
    ……
    <p>感兴趣内容n</p>
    <div class='entry-content'><div>捣乱</div><p>兴趣</p></div>
    <div class='entry-content'>我是来捣乱的2<div class= 'ooxx'>我是来捣乱的3</div></div>
    </div>
    <div class='entry-content'>
    <p>内容1</p>
    <p>内容2</p>
    ……
    <p>内容n</p>
    </div>
    </body>
    </html>
    '''
    m=myhp()
    m.feed(the_page)
    m.close()

结果:

感兴趣内容1
感兴趣内容2
感兴趣内容n
内容1
内容2
内容n

版权声明:本文为博主原创文章,未经博主允许不得转载。

posted @ 2013-11-12 15:50  前行者2011  阅读(80)  评论(0编辑  收藏  举报