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)    

原文地址:https://www.cnblogs.com/andingding-blog/p/9125654.html

时间: 2024-10-29 18:00:20

python自带的用于解析HTML的库HtmlParser的相关文章

python自带库及第三方库api察看

今天发现一个很有意思的功能,python自带了所有库的文档查看器,配置如下: 配置pydoc服务,cmd中输入如下代码: python –m pydoc –p 1234 回车后 ,使用过程中,该窗口不要关闭. 然后,在浏览器中输入网址:http://localhost:1234/ ,打开python自带的及集成的第三方库的api. 界面类似如下: 此工具对于察看第三方库的帮助文档非常方便

Python 获取接口数据,解析JSON,写入文件

Python 获取接口数据,解析JSON,写入文件 用于练手的例子,从国家气象局接口上获取JSON数据,将它写入文件中,并解析JSON: 总的来说,在代码量上,python代码量要比java少很多.而且python看起来更直观一些: 以下是代码: import types import urllib2 import json duan ="--------------------------" #在控制台断行区别的 #利用urllib2获取网络数据 def registerUrl():

python中if __name__ == &#39;__main__&#39;: 解析

当你打开一个.py文件时,经常会在代码的最下面看到if __name__ ==  '__main__':,现在就来介 绍一下它的作用. 模块是对象,并且所有的模块都有一个内置属性 __name__.一个模块的 __name__ 的值取决于您如何应用模块.如果 import  一个模块,那么模块__name__ 的值通常为模块文件名,不带路径或者文件扩展名.但是您也可以像一个标准的程序样直接运行模块,在这 种情况下, __name__  的值将是一个特别缺省"__main__". ///

python Beautiful Soup 抓取解析网页

Beautiful Soup is a Python library designed for quick turnaround projects like screen-scraping.总之就是一个解析xml和html之类的库,用着还算顺手. 官网地址:http://www.crummy.com/software/BeautifulSoup/ 下面来介绍下使用python和Beautiful Soup 抓取一个网页上的PM2.5数据. PM2.5 数据的网站:http://www.pm25.

python中format函数用于字符串的格式化

python中format函数用于字符串的格式化 通过关键字 print('{名字}今天{动作}'.format(名字='陈某某',动作='拍视频'))#通过关键字 grade = {'name' : '陈某某', 'fenshu': '59'} print('{name}电工考了{fenshu}'.format(**grade))#通过关键字,可用字典当关键字传入值时,在字典前加**即可 通过位置 print('{1}今天{0}'.format('拍视频','陈某某'))#通过位置 print

Python工具 | 10个用于处理日期和时间的 Python 库

1??arrow 更好的 Python 日期时间操作类库. 官网 2??Chronyk Python 3 的类库,用于解析手写格式的时间和日期. GitHub 3??dateutil Python datetime 模块的扩展. GitHub 4??delorean 解决 Python 中有关日期处理的棘手问题的库. 官网 5??maya 人性化的时间处理库. GitHub 6??moment 一个用来处理时间和日期的 Python 库.灵感来自于?Moment.js. GitHub 7??pe

python高级编程之列表解析

#列表解析 #编写0到10之间的偶数 #方法1 #结果:[0, 2, 4, 6, 8] num=range(10) num1=len(num) evens=[] i=0 while i<num1: if i%2==0: evens.append(i) i+=1 print evens #方法2 print [(i)for i in range(10)if i%2==0] #enumerate获取索引 #方法1 i=0 l=['a','b','c','d'] for  li in l: l[i]=

Python 自带IDLE中调试程序

在vs2013下调试过Python,今天试了下使用自带IDLE调试,相比而言后者效果不好. 记录一下 http://q.cnblogs.com/q/35869/ 在“Python Shell”窗口中单击“Debug”菜单中的“Debugger”菜单项,就可以启动IDLE的交互式调试器.这时,IDLE会打开“Debug Control”窗口,并在“Python Shell”窗口中输出“[DEBUG ON]”并后跟一个“>>>”提示符.这样,我们就能像平时那样使用这个“Python Shel

专家带你全面解析英国硕士留学预科

英国留学有着享誉全球的高质量教育水准.英国教育以历史悠久.高标准.高质量著称,在世界范围内享有盛誉.英国高校所颁发的学历.学位证书得到国际社会的普遍认可,毕业生的工资薪酬也名列前茅.这也是英国留学经久不衰的主要原因.下面就由四川外国语大学预科专家带你深度解析英国留学硕士预科. 1. 什么是硕士预科? 英国大学的硕士预科是英国大学或学院为更多不能直接入读硕士课程的学生提供的过度课程.硕士预科分为2学期和3学期的课程.开课时间分别为9月和1月.申请者根据自己的条件来选择适合的课程. 学习长度:半年到