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 = '''
欢迎访问
'''
parser = LinkParser()
parser.feed(html_doc)例 2:提取所有文本内容
from html.parser import HTMLParser
class TextExtractor(HTMLParser):
def handle_data(self, data):
print("文本内容:", data.strip())
html = ' 标题 这是一段文字。'
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('')例 4:处理 HTML 注释
from html.parser import HTMLParser
class CommentParser(HTMLParser):
def handle_comment(self, data):
print("注释内容:", data.strip())
parser = CommentParser()
parser.feed(' ')例 5:提取网页标题 的内容
from html.parser import HTMLParser
from 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
# 打开网页并读取 HTML
url = "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 内容,需先用正确的编码解码成字符串。
“点赞有美意,赞赏是鼓励”
特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。
Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.