HTMLParser
html.parser.HTMLParser 是标准库中的宽松 HTML 解析器。它按出现顺序调用回调方法,适合提取简单信息;复杂 DOM 查询可使用专业 HTML 解析库。
基本用法
from html.parser import HTMLParser
class LinkParser(HTMLParser):
def handle_starttag(self, tag, attrs):
if tag == "a":
attributes = dict(attrs)
print("链接:", attributes.get("href"))
def handle_data(self, data):
text = data.strip()
if text:
print("文本:", text)
parser = LinkParser()
parser.feed('<a href="/docs">文档</a>')
parser.close()
常用回调包括 handle_starttag、handle_startendtag、handle_endtag、handle_data、handle_comment 和 handle_entityref。attrs 是 (name, value) 列表,属性名通常已转为小写。
维护解析状态
class TitleParser(HTMLParser):
def __init__(self):
super().__init__()
self.in_title = False
self.title = []
def handle_starttag(self, tag, attrs):
self.in_title = tag == "title"
def handle_endtag(self, tag):
if tag == "title":
self.in_title = False
def handle_data(self, data):
if self.in_title:
self.title.append(data)
解析结束后使用 "".join(parser.title)。输入可以分多次调用 feed(),解析器会处理跨块标签;完成后调用 close() 触发收尾。
转义、限制与误区
使用 html.escape() 生成 HTML 文本,使用 html.unescape() 还原实体。HTMLParser 不会构建 DOM,不保证修复所有畸形 HTML,也不会执行 JavaScript。不要把回调数据直接拼进 HTML;输出到页面前仍需按上下文进行转义。处理网络内容时设置下载大小和超时限制。