• python自带的用于解析HTML的库HtmlParser


    转自博客https://www.cnblogs.com/masako/p/5868367.html

    HtmlParser,顾名思义,是解析Html的一个工具。python自带的。

    一、常用属性和方法介绍

      HtmlParser是一个类,在使用时一般继承它然后重载它的方法,来达到解析出需要的数据的目的。

      1.常用属性:

        lasttag,保存上一个解析的标签名,是字符串。

      2.常用方法: 

        handle_starttag(tag, attrs) ,处理开始标签,比如<div>;这里的attrs获取到的是属性列表,属性以元组的方式展示
        handle_endtag(tag) ,处理结束标签,比如</div>
        handle_startendtag(tag, attrs) ,处理自己结束的标签,如<img />
        handle_data(data) ,处理数据,标签之间的文本
        handle_comment(data) ,处理注释,<!-- -->之间的文本

    二、基本使用

      不多说,上代码

    复制代码
    from html.parser import HTMLParser
    
    
    class MyHTMLParser(HTMLParser):
    
        def handle_starttag(self, tag, attrs):
            """
            recognize start tag, like <div>
            :param tag:
            :param attrs:
            :return:
            """
            print("Encountered a start tag:", tag)
    
        def handle_endtag(self, tag):
            """
            recognize end tag, like </div>
            :param tag:
            :return:
            """
            print("Encountered an end tag :", tag)
    
        def handle_data(self, data):
            """
            recognize data, html content string
            :param data:
            :return:
            """
            print("Encountered some data  :", data)
    
        def handle_startendtag(self, tag, attrs):
            """
            recognize tag that without endtag, like <img />
            :param tag:
            :param attrs:
            :return:
            """
            print("Encountered startendtag :", tag)
    
        def handle_comment(self,data):
            """
    
            :param data:
            :return:
            """
            print("Encountered comment :", data)
    
    
    parser = MyHTMLParser()
    parser.feed('<html><head><title>Test</title></head>'
                '<body><h1>Parse me!</h1><img src = "" />'
                '<!-- comment --></body></html>')
    复制代码

      以上是根据python手册写的基本使用,解析了一个简单的html。可以运行看看,主要用于了解各个函数负责解析的部分,以及解析顺序。

    三、实用案例

      以下的实用案例均在上面的代码中修改对应函数,每个实例都是单独的。

      解析的html如下:

    复制代码
    <html>
        <head>
            <title>Test</title>
        </head>
        <body>
            <h1>Parse me!</h1>
            <img src = "" />
            <p>A paragraph.</p>
                    <p class = "p_font">A paragraph with class.</p>
                    <!-- comment -->
            <div>
                <p>A paragraph in div.</p>
            </div>
        </body>
    </html>
        
    复制代码

      1.获取属性的函数,是个静态函数,新增的。直接定义在类中,返回属性名对应的属性

    def _attr(attrlist, attrname):
        for attr in attrlist:
            if attr[0] == attrname:
                return attr[1]
        return None

      2.获取所有p标签的文本,最简单方法只修改handle_data

    def handle_data(self, data):
        if self.lasttag == 'p':
            print("Encountered p data  :", data)

      3.获取css样式(class)为p_font的p标签的文本,使用了案例1,增加一个实例属性作为标志,选取需要的标签

    复制代码
    def __init__(self):
        HTMLParser.__init__(self)
        self.flag = False
    
    def handle_starttag(self, tag, attrs):
        if tag == 'p' and _attr(attrs, 'class') == 'p_font':
            self.flag = True
            
    def handle_data(self, data):
        if self.flag == True:
            print("Encountered p data  :", data)
    复制代码

      4.获取p标签的属性列表

    def handle_starttag(self, tag, attrs):
        if tag == 'p':
            print("Encountered p attrs  :", attrs)

      5.获取p标签的class属性

    def handle_starttag(self, tag, attrs):
        if tag == 'p' and _attr(attrs, 'class'):
            print("Encountered p class  :", _attr(attrs, 'class'))

      6.获取div下的p标签的文本

    复制代码
    def __init__(self):
        HTMLParser.__init__(self)
        self.in_div = False
    
    def handle_starttag(self, tag, attrs):
        if tag == 'div':
            self.in_div = True
            
    def handle_data(self, data):
        if self.in_div == True and self.lasttag == 'p':
            print("Encountered p data  :", data)
    复制代码

      7.处理注释中的标签,若需要的数据在注释中,使用一般函数解析不到

        处理方法为,写两个类,继承HTMLParser。在其中一个类的handle_comment里实例化解析类,和其他标签一样解析

        这里的MyHTMLParser可以为基本使用中的MyHTMLParser,或者按需重写。

    复制代码
    class CommentHTMLParser(HTMLParser):
        def __init__(self):
            HTMLParser.__init__(self)
            
        def handle_comment(self,data):
            cparser = MyHTMLParser()
            cparser.feed(data)    
    复制代码
  • 相关阅读:
    SPSS—回归—曲线估计方程案例解析
    SPSS—非线性回归(模型表达式)案例解析
    SPSS—回归—二元Logistic回归案例分析
    SPSS-两变量相关性分析
    SPSS-单因素方差分析(ANOVA) 案例解析
    SPSS-比较均值-独立样本T检验 案例解析
    做MFC的时候引用了头文件但VC还是报missing storage-class or type specifiers
    GetDocument missing storage-class or type specifiers的解决方法
    Python如何安装模块
    AE IRasterCursor 改变栅格图层像素值
  • 原文地址:https://www.cnblogs.com/andingding-blog/p/9125654.html
Copyright © 2020-2023  润新知