这类问题我又碰上了一次。清洗网页正文时用 BeautifulSoup 的 get_text,代码块里的 List 变成 List,泛型全丢,再把 HTML 转义还原后代码彻底不可读。

第一反应是「html.unescape 执行了两次,转义字符被二次解析」,验证下来不成立。

把日志和配置对完,能解释这个现象的基本就这几处。get_text 把标签当结构解析,未转义的尖括号被吞;清洗前没有把 pre 与 code 块整体保护起来;用了 lxml 的 recover 模式,非法标签被直接丢弃。

上来先确认原始 HTML 里代码块是否已转义

python -c "import re;h=open('page.html',encoding='utf-8').read();print(re.findall(r'<code>.*?</code>',h)[:2])"

取出代码块占位后再清洗正文

python -c "from bs4 import BeautifulSoup;s=BeautifulSoup(open('page.html',encoding='utf-8').read(),'html.parser');print([c.get_text() for c in s.find_all('code')][:2])"

然后用占位符替换代码块再统一 get_text

python clean.py --protect pre,code --placeholder __CODE_%d__

剩下的就是清洗完把占位符替换回原始转义文本

python -c "import html;print(html.unescape('&lt;String&gt;'))"

改完先别撤,确认这几项。清洗后的正文里 List 完整保留,代码块数量与原文一致,占位符全部被替换回去。

提醒一点。解析器只认结构,代码块里的尖括号必须先转义或先摘出来,任何一步二次 unescape 都会把内容改坏。这类问题最好一次改到位,反复小改反而容易把原因搅混。

作者 9823189