如何正确实现RSS源单/双重转义标题的反转义处理
RSS多重转义内容兼容反转义方案
问题场景
处理RSS feed内容时,除了常规的单次HTML实体转义内容,还会遇到异常多重转义的内容,典型异常标题样例:
<title>S&amp;amp;P 500 : Wall Street amorce un rebond, Binance fait l&amp;apos;objet d&amp;apos;une enquête de la SEC</title>
浏览器对该内容的正确渲染结果为:
S&P 500 : Wall Street amorce un rebond, Binance fait l'objet d'une enquête de la SEC
常规单次反转义逻辑处理多重转义内容会残留转义字符,硬编码固定反转义次数(比如固定反转2次)又无法兼容单次转义、三重及以上转义的场景,容易出现转义不足或过转义问题。
实现方案
核心逻辑是循环执行标准HTML实体反转义,直到反转义结果不再发生变化为止,该方案天然兼容1次到N次的任意层数转义,不需要提前判断内容转义次数,也不会出现过转义问题。
实现注意事项
- 不要硬编码固定反转义次数:固定次数无法覆盖所有转义场景,次数设少了会残留转义实体,次数设多了会把正文里本来需要保留的实体字符错误解析
- 仅使用标准HTML实体反转义规则:只处理标准命名实体(
&/'/</>/"等)和数字实体('/'等),不要自定义扩展解析规则,避免误解析正文内容 - 终止条件判断:每次执行反转义后对比新旧字符串,二者完全一致时说明已经没有可解析的转义实体,直接终止流程返回结果即可
- 前置处理优先使用标准XML解析器提取RSS节点文本,不要用正则表达式匹配截取标签内容,避免标签解析错误引入额外问题
代码示例(Python)
import html def unescape_multi_escape(content: str) -> str: while True: current_result = html.unescape(content) # 无更多可反转义内容时终止 if current_result == content: return current_result content = current_result
效果验证
- 输入单次转义内容
S&P 500:第一次反转义得到S&P 500,第二次执行反转义结果无变化,返回正确结果 - 输入前述三重转义的异常标题:经过3次循环反转义后得到和浏览器渲染完全一致的正确文本,第四次执行无变化后终止返回
内容的提问来源于stack exchange,提问作者Vladimir Bershov
相关产品推荐
相关产品推荐

