You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用aiohttp/asyncio时Feedparser的_HTMLSanitizer未生效,求解决方案

Feedparser _HTMLSanitizer配置未生效的问题排查与解决

嘿,我来帮你搞定这个问题!你遇到的情况是明明修改了feedparser._HTMLSanitizer的属性,但输出还是保留了div等未授权标签,核心原因其实很简单:feedparser默认不会自动启用HTML清理功能,你修改了 sanitizer 的规则,但没触发它运行,自然不会生效。

问题根源

feedparser的_HTMLSanitizer类只是定义了清理规则,但默认解析Feed时,并不会主动调用它去处理entry的summary或content字段。你直接修改类属性后,没有告诉feedparser“要用这个规则来清理HTML”,所以原始的HTML内容完全没经过过滤就输出了。

另外还有个小细节:你看到的<div>是转义后的实体(&lt;div&gt;),不过feedparser在开启sanitize后会自动处理这些转义内容,不用额外手动转码。

解决步骤

要让sanitizer生效,需要做两件事:

  • 提前修改_HTMLSanitizer的规则(你已经做了这步,没问题)
  • 在调用feedparser.parse()时,开启sanitize=True参数,强制feedparser用你配置的规则清理HTML内容

修改后的完整代码

import aiohttp
import asyncio
import feedparser

# 先配置sanitizer规则,确保在parse之前修改
feedparser._HTMLSanitizer.acceptable_elements = ['a', 'img']
feedparser._HTMLSanitizer.acceptable_css_keywords = []
feedparser._HTMLSanitizer.acceptable_css_properties = []
feedparser._HTMLSanitizer.acceptable_svg_properties = []
feedparser._HTMLSanitizer.acceptable_attributes = ['href', 'src']

async def load_feed():
    async with aiohttp.ClientSession() as session:
        async with session.get('http://zycrypto.com/feed') as response:
            text = await response.text()
            # 关键:添加sanitize=True参数,启用HTML清理
            parsed = feedparser.parse(text, sanitize=True)
            for entry in parsed.entries:
                print(entry.title)
                print(entry.summary, '\n\n')

asyncio.get_event_loop().run_until_complete(load_feed())

验证预期输出

修改后,输出会自动过滤掉div、style、class等未授权的标签和属性,只保留:

  • <img>标签及src属性
  • <a>标签及href属性
  • 纯文本内容

这样就能得到你想要的干净HTML内容啦!

内容的提问来源于stack exchange,提问作者PirateApp

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.05.08 19:08:00