zoukankan      html  css  js  c++  java
  • #小练习 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

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

  • 相关阅读:
    js作用域链
    函数声明提升
    18年年终总结之谈谈焦虑这件事
    混合开发中ios兼容问题
    vue 缓存的keepalive页面刷新数据
    vue里监听安卓的物理返回键
    vue根据数组对象中某个唯一标识去重
    Sublime Text3 插件
    全面理解Javascript闭包和闭包的几种写法及用途
    javascript深入理解js闭包
  • 原文地址:https://www.cnblogs.com/think1988/p/4628018.html
Copyright © 2011-2022 走看看