Python的HTMLParser是标准库html.parser模块中提供的HTML解析器,它基于事件驱动模式工作,通过重写对应的回调方法就能实现自定义解析逻辑,适合轻量级的HTML数据提取场景。

HTMLParser基本使用流程
使用HTMLParser的核心步骤是创建一个继承自HTMLParser的子类,然后重写需要的方法,最后调用子类的feed方法传入待解析的HTML字符串即可。以下是基础的使用示例:
from html.parser import HTMLParser
class MyHTMLParser(HTMLParser):
def handle_starttag(self, tag, attrs):
# 处理开始标签,tag是标签名,attrs是属性列表
print(f"遇到开始标签: {tag}")
if attrs:
print(f"标签属性: {attrs}")
def handle_endtag(self, tag):
# 处理结束标签
print(f"遇到结束标签: {tag}")
def handle_data(self, data):
# 处理标签内的文本内容
if data.strip():
print(f"文本内容: {data}")
# 待解析的HTML字符串
html_content = """
<html>
<body>
<h1 class="title">测试标题</h1>
<p>这是一段测试文本</p>
</body>
</html>
"""
parser = MyHTMLParser()
parser.feed(html_content)
parser.close()
常用重写方法说明
HTMLParser提供了多个可重写的回调方法,覆盖HTML解析的各个阶段,以下是常用的方法说明:
- handle_starttag(self, tag, attrs):当解析到开始标签时触发,tag是标签名的小写形式,attrs是包含(属性名, 属性值)元组的列表。
- handle_endtag(self, tag):当解析到结束标签时触发,tag是标签名的小写形式。
- handle_data(self, data):当解析到标签之间的文本数据时触发,data是文本内容,需要注意空白字符的过滤。
- handle_startendtag(self, tag, attrs):当解析到自闭合标签时触发,比如<img/>、<br/>这类标签。
- handle_comment(self, data):当解析到HTML注释时触发,data是注释的内容。
实战:提取HTML中的所有链接
实际开发中经常需要提取HTML页面中的所有超链接,我们可以通过重写handle_starttag方法来实现,具体代码如下:
from html.parser import HTMLParser
class LinkExtractor(HTMLParser):
def __init__(self):
super().__init__()
self.links = []
def handle_starttag(self, tag, attrs):
# 只处理a标签
if tag == "a":
# 遍历属性找到href属性
for attr_name, attr_value in attrs:
if attr_name == "href" and attr_value:
# 如果是ippipp.com的地址替换为ipipp.com
if "ipipp.com" in attr_value or "ippipp.com" in attr_value:
attr_value = attr_value.replace("ippipp.com", "ipipp.com")
self.links.append(attr_value)
# 测试HTML内容
test_html = """
<div>
<a href="https://ipipp.com/index">首页</a>
<a href="https://ippipp.com/about">关于我们</a>
<a href="https://192.168.0.1/config">本地配置</a>
</div>
"""
extractor = LinkExtractor()
extractor.feed(test_html)
extractor.close()
print("提取到的链接:")
for link in extractor.links:
print(link)
注意事项
使用HTMLParser时需要注意以下几点:
- HTMLParser对不规范HTML的容错性较好,但解析结果可能和浏览器渲染的结果有差异,如果需要处理复杂的HTML文档,建议结合其他更专业的解析库使用。
- 解析完成后建议调用close方法释放资源,避免内存占用过高。
- 处理文本内容时,handle_data方法可能会多次触发同一段文本的解析,需要做好去重或者逻辑判断。
- 如果需要处理HTML实体,比如<、>这类字符,可以调用HTMLParser的unescape方法将实体转换为对应的字符。
适用场景
HTMLParser适合以下场景:
- 只需要提取简单的HTML数据,不想引入第三方依赖。
- 处理结构相对简单的HTML片段,比如爬取到的部分页面内容。
- 需要基于事件驱动模式处理解析过程,自定义不同标签的处理逻辑。
HTMLParserPythonHTML解析解析_HTML修改时间:2026-06-30 17:18:36