Python 库手册:html.parser HTML 解析模块

发布于:2025-07-24 ⋅ 阅读:(18) ⋅ 点赞:(0)

html.parser 是 Python 标准库中用于解析 HTML 文件的模块,提供了一个基础类 HTMLParser,通过继承并重写其方法,可以提取网页中的标签、属性与文本内容。它是纯 Python 实现的轻量级 HTML 解析工具,无需第三方依赖,可用于简单的网页内容提取任务。

常见应用场景:

(1)提取 HTML 中的文本、超链接、图片等信息。

(2)编写简单的网页内容抓取器(抓取不依赖 JavaScript 渲染的网页)。

(3)快速分析本地 HTML 文件结构。

(4)替代复杂的 HTML DOM 操作。

  ◆  ◆

核心概念

1、HTMLParser 是 HTML 解析的核心类。

这是一个基于事件驱动(event-driven)的类,它会在遇到 HTML 标签时触发对应的处理方法(如 handle_starttag()、handle_data() 等),你需要通过继承它并重写这些方法来自定义行为。

2、解析流程是“逐标签解析”的。

解析器会按顺序扫描 HTML 文本:遇到开始标签时调用 handle_starttag()。遇到结束标签时调用 handle_endtag()。遇到数据内容(文本节点)时调用 handle_data()。遇到注释时调用 handle_comment(),等等。

3、HTML 标签的属性以 (name, value) 元组形式提供

在 handle_starttag() 中,标签属性通过第二个参数 attrs 提供,这是一个 [(属性名, 属性值)] 的列表,例如:

[('href', 'https://example.com'), ('target', '_blank')]

  ◆  ◆

应用举例

例 1:提取所有链接

from html.parser import HTMLParser
class LinkParser(HTMLParser):    def handle_starttag(self, tag, attrs):        if tag == 'a':            for name, value in attrs:                if name == 'href':                    print("链接地址:", value)
html_doc = '''<html><body><p>欢迎访问 <a href="https://mediaTEA.edu">示例站点</a></p></body></html>'''
parser = LinkParser()parser.feed(html_doc)

例 2:提取所有文本内容

from html.parser import HTMLParser
class TextExtractor(HTMLParser):    def handle_data(self, data):        print("文本内容:", data.strip())
html = '<h1>标题</h1><p>这是一段文字。</p>'parser = TextExtractor()parser.feed(html)

例 3:打印 HTML 中的所有标签及属性

from html.parser import HTMLParser
class TagPrinter(HTMLParser):    def handle_starttag(self, tag, attrs):        print(f"标签:<{tag}>")        for attr in attrs:            print(f"  属性:{attr[0]} = {attr[1]}")
parser = TagPrinter()parser.feed('<img src="img.jpg" alt="图片" width="100">')

例 4:处理 HTML 注释

from html.parser import HTMLParser
class CommentParser(HTMLParser):    def handle_comment(self, data):        print("注释内容:", data.strip())
parser = CommentParser()parser.feed('<!-- 这是注释内容 -->')

例 5:提取网页标题 <title> 的内容

from html.parser import HTMLParserfrom urllib.request import urlopen 
class TitleParser(HTMLParser):    def __init__(self):        super().__init__()        self.in_title = False        self.title = ""
    def handle_starttag(self, tag, attrs):        if tag.lower() == 'title':            self.in_title = True
    def handle_data(self, data):        if self.in_title:            self.title += data.strip()
    def handle_endtag(self, tag):        if tag.lower() == 'title':            self.in_title = False
# 打开网页并读取 HTMLurl = "https://www.example.com"with urlopen(url) as response:    html = response.read().decode("utf-8")
# 提取标题parser = TitleParser()parser.feed(html)print("网页标题:", parser.title)

  ◆  ◆

常用函数速览

HTMLParser.feed(data)

向解析器传入 HTML 字符串,触发各类回调方法。

参数:

data:字符串类型的 HTML 内容

返回:无

说明:

将 HTML 文本输入解析器的 .feed() 方法后,解析才会开始。可反复调用 .feed() 追加数据。

HTMLParser.close()

结束 HTML 解析,确保所有缓存数据被处理。

说明:

在某些流式解析场景中,.close() 可用于标记输入结束并清理状态,但通常 .feed() 足以完成解析。

HTMLParser.reset()

重置解析器到初始状态(不常用)。

  ◆  ◆

补充说明

1、html.parser 不执行 JavaScript,因此适用于静态 HTML 内容。

2、解析 HTML 时不构建 DOM 树,而是使用事件回调(类似 SAX)。

与 xml.etree 不同,HTMLParser 不会创建节点树。你必须在回调中自行提取、处理或存储内容,适合快速提取结构简单或特定模式的 HTML 内容。

3、不能处理格式错误严重的 HTML。可使用第三方库 BeautifulSoup。

4、若使用非 UTF-8 编码的 HTML 内容,需先用正确的编码解码成字符串。

图片

“点赞有美意,赞赏是鼓励”


网站公告

今日签到

点亮在社区的每一天
去签到