使用aiohttp/asyncio时Feedparser的_HTMLSanitizer未生效,求解决方案
Feedparser _HTMLSanitizer配置未生效的问题排查与解决
嘿,我来帮你搞定这个问题!你遇到的情况是明明修改了feedparser._HTMLSanitizer的属性,但输出还是保留了div等未授权标签,核心原因其实很简单:feedparser默认不会自动启用HTML清理功能,你修改了 sanitizer 的规则,但没触发它运行,自然不会生效。
问题根源
feedparser的_HTMLSanitizer类只是定义了清理规则,但默认解析Feed时,并不会主动调用它去处理entry的summary或content字段。你直接修改类属性后,没有告诉feedparser“要用这个规则来清理HTML”,所以原始的HTML内容完全没经过过滤就输出了。
另外还有个小细节:你看到的<div>是转义后的实体(<div>),不过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
相关产品推荐
相关产品推荐

