
csharp
from html.parser import HTMLParser
class LinkExtractor(HTMLParser):
"""一个自定义的HTML解析器,用于提取所有链接"""
def __init__(self):
# 初始化父类,convert_charrefs=True 是默认且推荐的设置
super().__init__(convert_charrefs=True)
self.links = [] # 用于存储提取到的链接
def handle_starttag(self, tag, attrs):
"""重写开始标签处理方法"""
# 我们只关心 <a> 标签
if tag == 'a':
# attrs 是一个包含 (属性名, 属性值) 元组的列表
for attr_name, attr_value in attrs:
if attr_name == 'href':
# 找到 href 属性,将其添加到列表中
self.links.append(attr_value)
print(f"找到一个链接: {attr_value}")
def handle_data(self, data):
"""重写文本处理方法,这里仅仅是演示,可以对文本做进一步处理"""
# 对于提取链接这个任务,我们实际上不需要处理文本
pass
# 1. 准备一段待解析的HTML代码片段
sample_html = """
<div class="container">
<h1>我的收藏夹</h1>
<p>欢迎来到我的<a href="https://example.com">示例网站</a>。</p>
<ul>
<li><a href="https://python.org">Python官网</a></li>
<li><a href="/about">关于我们</a></li>
<li><a>这是一个无效的链接,没有href属性</a></li>
</ul>
<img src="logo.png" alt="Logo">
</div>
"""
# 2. 创建解析器实例
parser = LinkExtractor()
# 3. 将HTML数据喂给解析器
# 注意 feed 方法可以分多次调用,对于流式数据非常有用
parser.feed(sample_html)
# 4. 解析完成后,可以获取结果
print("\n所有提取到的链接:")
for link in parser.links:
print(link)
################ 结 果 ##########################
找到一个链接: https://example.com
找到一个链接: https://python.org
找到一个链接: /about
所有提取到的链接:
https://example.com
https://python.org
/about