• 用python解析html--SGMLParser


     


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

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

    start_tagname(self, attrs) 
    end_tagname(self) 
    handle_data(self, text) 
    tagname就是标签名称,比如当遇到<pre>,就会调用start_pre,遇到</pre>,就会调用 end_pre,attrs即为标签的参数,以[(attribute, value), (attribute, value), ...]的形式传回,我们要做的就是在其子类重载自己感兴趣标签对应的函数。 

    一个经典的例子: 
    Python代码  收藏代码
    1. from sgmllib import SGMLParser  
    2. class URLLister(SGMLParser):  
    3.     self.urls = []  
    4.     def start_a(self, attrs):                       
    5.         href = [v for k, v in attrs if k=='href']   
    6.         if href:  
    7.             self.urls.extend(href)  

    顾名思义,这个类的作用就是把html中的所有连接(<a>标签)中的地址(href属性的值)提取出来,放到一个list里面,很实用的功能。^^ 

    比如处理下面的html: 
    Html代码  收藏代码
    1. <tr>  
    2. <td height="207" colspan="2" align="left" valign="top" class="normal">  
    3. <p>Damien Rice - 《0》 </p>  
    4. <href="http://galeki.xy568.net/music/Delicate.mp3">1. Delicate</a><br />  
    5. <href="http://galeki.xy568.net/music/Volcano.mp3">2. Volcano</a><br />  
    6. <href="http://galeki.xy568.net/music/The Blower's Daughter.mp3">3. The Blower's Daughter</a><br />  
    7. <href="http://galeki.xy568.net/music/Cannonball.mp3">4. Cannonball </a><br />  
    8. <href="http://galeki.xy568.net/music/Older Chests.mp3">5. Order Chests</a><br />  
    9. <href="http://galeki.xy568.net/music/Amie.mp3">6. Amie</a><br />  
    10. <href="http://galeki.xy568.net/music/Cheers Darlin'.mp3">7. Cheers Darling</a><br />  
    11. <href="http://galeki.xy568.net/music/Cold Water.mp3">8. Cold water</a><br />  
    12. <href="http://galeki.xy568.net/music/I Remember.mp3">9. I remember</a><br />  
    13. <href="http://galeki.xy568.net/music/Eskimo.mp3">10. Eskimo</a></p>  
    14. </td>  
    15. </tr>  

    很乱对吧?下面让举个例子利用URLLister提取出上面mp3下载的地址: 

    date="上面那一堆…………" 
    lister=URLLister() 
    lister.feed(date) 
    用feed()把要处理的html传递给对象实体,然后我们来看看处理结果: 

    print lister.urls 
    显示: 

    ['http://galeki.xy568.net/music/Delicate.mp3', 
    'http://galeki.xy568.net/music/Volcano.mp3', 
    "http://galeki.xy568.net/music/The Blower's Daughter.mp3", 
    'http://galeki.xy568.net/music/Cannonball.mp3', 
    'http://galeki.xy568.net/music/Older Chests.mp3', 
    'http://galeki.xy568.net/music/Amie.mp3', 
    "http://galeki.xy568.net/music/Cheers Darlin'.mp3", 
    'http://galeki.xy568.net/music/Cold Water.mp3', 
    'http://galeki.xy568.net/music/I Remember.mp3', 
    'http://galeki.xy568.net/music/Eskimo.mp3'] 
    好了,是不是很方便?现在我们知道了如何处理标签中的属性,那么如何处理标签包含的文字呢?就是上面列出的handle_data(self, text),当遇到标签内的内容,就会调用这个函数,传入的text自然就是标签内的内容了,不过,如何筛选出感兴趣标签内的内容呢?比如上面歌曲的列 表,这时候就要配合start_tagname、end_tagname,用做标记的方法来达到这个目的: 
    Python代码  收藏代码
    1. class ListName(SGMLParser):  
    2.     is_a=""  
    3.     name=[]  
    4.     def start_a(self, attrs):  
    5.         self.is_a=1  
    6.     def end_a(self):  
    7.         self.is_a=""  
    8.     def handle_data(self, text):  
    9.         if self.is_a:  
    10.                 self.name.append(text)  

    这里添加了一个is_a标记,再在handle_date中添加一个if,也就是说,仅仅在a标签内,才会把标签里的内容加到name[]里去。 

    看看结果: 
    Python代码  收藏代码
    1. listname=ListName()  
    2. listname.feed(date)  
    3. print listname.name  

    显示: 

    ['1.Delicate', '2.Volcano', "3.The Blower's Daughter", 
    '4.Cannonball ', '5.Order Chests', '6.Amie', 
    '7.Cheers Darling', '8.Cold water', '9.I remember', 
    '10.Eskimo'] 
    OK,搞定~ 

    SGMLParser内置的方法不仅仅只有这三个,还有处理注释的handle_comment,还有处理声明的handle_decl等等等等,不过使用方法和上面的基本相同,不再多写了。
  • 相关阅读:
    linux 硬盘满了 怎么优化
    Mysql 忘记密码 Linux
    嵌入式新闻早班车-第18期
    《安富莱嵌入式周报》第225期:2021.08.09--2021.08.15
    【DSP教程】第43章 IIR滤波器的Matlab设计
    【DSP教程】第42章 IIR无限冲击响应滤波器设计
    嵌入式新闻早班车-第17期
    《安富莱嵌入式周报》第224期:2021.08.02--2021.08.08
    H7-TOOL重大更新,发布WiFi版,新增暗黑主题,脱机烧录增加大唐半导体,自此高速USB,以太网和WiFi方式全部打通(2021-08-07)
    【STM32H7的DSP教程】第41章 FIR滤波器的群延迟(重要)
  • 原文地址:https://www.cnblogs.com/shijiaoyun/p/4863834.html
Copyright © 2020-2023  润新知