树洞 Python 使用 HTMLParser 解析 html

l_smile · 2018年04月20日 · 2638 次阅读

HTMLParser 是 Python 自带的一个类,主要用来解析 HTML 和 XHTML 文件。

HTMLParser 常用方法

  • handle_starttag(tag, attrs):找到开始标签时调用,attrs 是(名称,值)对的序列
  • handle_startendtag(tag, attrs):使用空标签时调用,默认分开处理开始和结束标签
  • handle_endtag(tag):找到结束标签时调用
  • handle_data(data):使用文本数据时调用
  • handle_charred(ref):当使用 ref;形式的实体引用时调用
  • handle_comment(data):注释时调用,只对注释内容调用
  • handle_decl(decl):声明<!...>形式时调用

使用 HTMLParser 非常简单,只需要在你的 python 文件中导入 HTMLParser 类,创建一个新类来继承它,并且对其 handle_starttag、handle_data 等事件处理方法进行重写从而解析出需要的 HTML 数据。

下面是一个简单的 Demo

# coding=utf-8

from HTMLParser import HTMLParser

# 创建类MyHTMLParser并继承HTMLParser
class MyHTMLParser(HTMLParser):
    #重写handle_starttag方法
    def handle_starttag(self, tag, attrs):
        print "Start tag:", tag
        for attr in attrs:
            print "     attr:", attr

    #重写handle_endtag方法
    def handle_endtag(self, tag):
        print "End tag  :", tag

    #重写handle_data方法
    def handle_data(self, data):
        print "Data     :", data

    #重写handle_comment方法
    def handle_comment(self, data):
        print "Comment  :", data

    #重写handle_charref方法
    def handle_charref(self, name):
        if name.startswith('x'):
            c = chr(int(name[1:], 16))
        else:
            c = chr(int(name))
        print "Num ent  :", c

    def handle_decl(self, data):
        print "Decl     :", data


if __name__ == "__main__":

    parser = MyHTMLParser()
    parser.feed('<html><head></head><body><p class = "aa" >Some&nbsp;<a href=\"#123\">html</a>parser&#62;<!-- comment --><br>END</p></body></html>')

以上这段代码通过 feed() 方法传入一个简单的 HTML 文件,对其开始标签及开始标签属性、结束标签、标签内容、注释、特殊字符等进行解析并打印。执行结果如下:

下面给出 HTMLParser 应用的两个实例

实例 1:抓取网页内容

# coding=utf-8

from urllib import urlopen
from HTMLParser import HTMLParser

class Scraper(HTMLParser):
    def handle_starttag(self, tag, attrs):
            print "StartedTag: ", tag

    def handle_endtag(self, tag):
        print "EndTag: ", tag

    def handle_data(self, data):
            print "Data: ", data

if __name__=="__main__":
    content = urlopen("http://www.baidu.com").read()
    sc = Scraper()
    sc.feed(content)

实例 2:对生成的 HTML 测试报告统计 Pass 和 Fail 个数

# coding=utf-8

from HTMLParser import HTMLParser

class AnalyzeReport(HTMLParser):
    def __init__(self):
        HTMLParser.__init__(self)
        self.ps = 0
        self.fail = 0

    def handle_starttag(self, tag, attrs):
        pass

    def handle_endtag(self, tag):
        pass

    def handle_data(self, data):
        '''
        # 打印测试用例详细执行结果
        if self.lasttag == 'font' or data.__contains__("用例:"):
            print data
        '''

        if data == "Fail":
            self.fail += 1
        elif data == "Pass":
            self.ps += 1
        else:
            pass

    def get_ps(self):
        return self.ps

    def get_fail(self):
        return self.fail

def read_html(filepath):
    '''
    :param filepath: 要解析的html文件路径
    :return: 返回文件内容
    '''
    try:
        f = open(filepath)
    except IOError, e:
        print e
    else:
        content = f.read()
    return content

if __name__ == "__main__":
    content = read_html("TestReport.html")
    pars = AnalyzeReport()
    pars.feed(content)
    print "*" * 100
    print "失败测试用例数:", pars.fail
    print "成功测试用例数:", pars.ps
暂无回复。
需要 登录 后方可回复, 如果你还没有账号请点击这里 注册