• python HTMLParser


    HTMLParser 是一个python自带的库,使用它可以很方便的解析html.

    使用HTMLPaser时应先生成它的一个子类,并且对handle_starttag或handle_data之类的事件处理方法进行覆盖

    HTMLParser的一些相关方法如下

     

    handle_starttag(tag,attrs)            

    找到开始标签是调用。attrs是(名称,值)对的序列

    handle_startendtag(tag,attrs)

    使用空标签是调用

    handle_endtag(tag)

    找到结束标签时调用 

    handle_data(data)

    使用文本数据时调用

    handle_charref(ref)

    当使用&#ref;形式的实体是调用 

    handle_entityref(name)

    当使用&name;形式的实体是调用 

    handle_comment(data)

    注释时调用

    handle_decl(decl)

    声明<!...>形式时调用

    handle_pi(data)

    处理指令时调用

     

     

    本文主要讲解常用的三个方法:

    handle_starttag

    handle_data

    handle_endtag

      

    假设我们的目的是对htlm文本data提取 名称:PyCon CZ 2017 时间:09 June

    data = r'''      <li>
                            <h3 class="event-title"><a href="/events/python-events/523/">PyCon Taiwan 2017</a></h3>
                            <p>
                            
                            
    <time datetime="2017-06-06T00:00:00+00:00">06 June &ndash; 12 June <span class="say-no-more"> 2017</span></time>
    
                                
    
                                
                                <span class="event-location">Academia Sinica, 128 Academia Road, Section 2, Nankang, Taipei 11529, Taiwan</span>
                                
                            </p>
                        </li>
                    
                        <li>
                            <h3 class="event-title"><a href="/events/python-events/513/">PyCon CZ 2017</a></h3>
                            <p>
    
    
    
    
    
                                
    
                                
                                <span class="event-location">Prague, Czechia</span>
                                
                            </p>
                        </li>'''
     1 from HTMLParser import HTMLParser
     2 
     3 class scraper(HTMLParser):
     4     def __init__(self):
     5         
     6         HTMLParser.__init__(self)
     7         self.a_flag=False
     8         self.time_flag=False
     9         
    10         self.events=[]
    11     def handle_starttag(self, tag, attrs):
    12         if tag=='a' and attrs[0][1]=="/events/python-events/513/":
    13             self.a_flag=True
    14             
    15         if tag=='time' and attrs[0][1]=='2017-06-09T00:00:00+00:00':
    16             self.time_flag=True
    17             
    18             
    19                     
    20     def handle_data(self, data):
    21         if self.a_flag:
    22             self.events.append(data)
    23         if self.time_flag:
    24             self.events.append(data)
    25             self.time_flag=False
    26             
    27             
    28     def handle_endtag(self, tag):
    29         if tag=="a":
    30             self.a_flag=False

     首先创建子类继承HTMLParser

    覆盖 handle_starttag

    当遇到标签 a 且 href属性的值为“/events/python-events/513/”时设置self.a_flag :Ture

    这时

    <a href="/events/python-events/513/">PyCon CZ 2017</a>

    data 为PyCon CZ 2017

    在handle_data中添加 data

    而在 time标签中的 因为&ndash; 的存在会分为两个data

    所以在第一次添加data后 将self.time_flag设为Flase

    <time datetime="2017-06-09T00:00:00+00:00">09 June &ndash; 12 June <span class="say-no-more"> 2017</span></time>

    在handle_endtag 中设置遇到</a>后 将self.a_flag设为False 这样后面遇到的 <a>标签的data就不会被写入

    最后调用feed方法运行这个解析器

    ep = scraper()
    ep.feed(data)
    for x in ep.events:
        print x

    输出:

    PyCon CZ 2017
    09 June 
  • 相关阅读:
    在springboot程序中自定义注解和反序列化实现
    文章相似度算法调研
    HTTP协议详解
    prototype.js 让你更深入的了解javascript的面向对象特性(转)
    ajax框架汇总
    prototype源码分析(转)
    c#中静态成员和实例成员(转)
    .NET中IDisposable接口的基本使用 (转)
    sql server 数据库优化(转)
    ADO.NET事物
  • 原文地址:https://www.cnblogs.com/hellow0rd/p/6915517.html
Copyright © 2020-2023  润新知