这类问题我又碰上了一次。清洗网页正文时用 BeautifulSoup 的 get_text,代码块里的 List
第一反应是「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('<String>'))"
改完先别撤,确认这几项。清洗后的正文里 List
提醒一点。解析器只认结构,代码块里的尖括号必须先转义或先摘出来,任何一步二次 unescape 都会把内容改坏。这类问题最好一次改到位,反复小改反而容易把原因搅混。
