python HtmlParser

HtmlParser,是python自带的一个解析html/xml等结构化数据的工具。

一、常用属性和方法介绍

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)  
©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 135,010评论 19 139
  • HTML标签解释大全 一、HTML标记 标签:!DOCTYPE 说明:指定了 HTML 文档遵循的文档类型定义(D...
    米塔塔阅读 3,331评论 1 41
  • 云海的形成是需要很好的条件,头一天大雾或小雨,形成浓重的云雾,次日阳光明媚,将云雾蒸腾起来,方可形成。根据上面的描...
    凡尘俗语阅读 242评论 0 0
  • 今天看到一则旧闻,说某小学让学生们清扫厕所,还配了图片,图中几个小学生正站在粪坑上奋力清扫,家长们则联名上书向学校...
    煊2606阅读 310评论 0 0
  • 一直想再次尝试画画,感受那种艺术和宁静。今天走进画室,看到些作品,喜欢,但觉得自己拿不起笔。以前也只是喜欢,没有真...
    张欣_2019阅读 143评论 0 0