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

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 提供,这是一个 [(属性名, 属性值)] 的列表,例如:

css 复制代码
[('href', 'https://example.com'), ('target', '_blank')]

◆ ◆

应用举例

例 1:提取所有链接

python 复制代码
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:提取所有文本内容

css 复制代码
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 中的所有标签及属性

python 复制代码
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 注释

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

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

python 复制代码
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 内容,需先用正确的编码解码成字符串。

"点赞有美意,赞赏是鼓励"

相关推荐
S01d13r7 分钟前
gunicorn + flask 处理高并发请求
python·flask·gunicorn
艾伦~耶格尔10 分钟前
【数据结构进阶】
java·开发语言·数据结构·学习·面试
杜子不疼.11 分钟前
《Python列表和元组:从入门到花式操作指南》
开发语言·python
pan0c2318 分钟前
数据处理与统计分析 —— numpy入门
python·numpy
帧栈29 分钟前
开发避坑指南(27):Vue3中高效安全修改列表元素属性的方法
前端·vue.js
max50060033 分钟前
基于桥梁三维模型的无人机检测路径规划系统设计与实现
前端·javascript·python·算法·无人机·easyui
excel1 小时前
使用函数式封装绘制科赫雪花(Koch Snowflake)
前端
WYH2871 小时前
C#控制台输入(Read()、ReadKey()和ReadLine())
开发语言·c#
祈祷苍天赐我java之术1 小时前
Java 迭代器(Iterator)详解
java·开发语言
秋氘渔1 小时前
综合案例:Python 函数知识整合 — 学生成绩管理系统
开发语言·python