
本文介绍使用 python 标准库 `html.unescape()` 高效、安全地将 html 字符实体(如 `'`、`"`、`&` 等)还原为可读的 unicode 字符,适用于网页标题提取、爬虫后处理等场景。
在通过 curl 抓取网页 HTML 内容时(例如 curl "%URLLink%" --insecure -L > "%HTMLFile%"),常会遇到标题或文本中包含 HTML 字符实体的情况,如:
La guerre de l'info : Israël / Hamas en replay - Complément d'enquête
其中 ' 是 Unicode 字符 '(单引号)的十进制数值字符引用(numeric character reference),é(虽未出现但常见)则是命名实体(named entity)。这类编码虽符合 HTML 规范,但直接阅读或进一步处理(如解析、存储、显示)前需还原为原始字符。
Python 3.4+ 提供了标准模块 html 中的 html.unescape() 函数,专用于此目的——它能统一处理命名实体(如 zuojiankuohaophpcn, ©)、十进制(©)和十六进制(©)数值引用,并自动映射到对应 Unicode 字符,无需额外依赖,线程安全,且完全兼容 HTML5 实体规范。
✅ 正确用法示例:
立即学习“Python免费学习笔记(深入)”;
# 一行命令:curl 获取 HTML → 提取 title 标签内容 → 解码 HTML 实体 → 输出干净文本 curl -sL --insecure "%URLLink%" | grep -o '.* ' | sed 's/\|<\/title>//g' | python3 -c "import sys, html; print(html.unescape(sys.stdin.read().strip()))"
或更清晰地封装为 Python 单行脚本(兼容管道输入):
curl -sL --insecure "%URLLink%" | python3 -c " import sys, html, re content = sys.stdin.read() title_match = re.search(r'(.*?) ', content, re.I | re.S) if title_match: print(html.unescape(title_match.group(1).strip())) else: print('Nofound') " > "%TitleFile%"
? 注意事项:
- html.unescape() 仅解码 HTML 实体,不解析或校验 HTML 结构。若输入含非法实体(如 yz;),会原样保留或抛出 ValueError(取决于 Python 版本),建议配合 try/except 做健壮处理;
- 它默认使用 UTF-8 编码处理字符串,确保输入为 str 类型(非 bytes);若从文件读取字节流,请先 .decode('utf-8');
- 不要与 xml.sax.saxutils.unescape() 混用——后者针对 XML,实体集不同(如不支持 ' 在旧版 XML 中);
- 对于大规模批量处理,可结合 BeautifulSoup(soup.get_text() 自动解码)或 lxml,但若仅需轻量解码,html.unescape() 是最简、最高效的选择。
? 总结:html.unescape() 是 Python 处理 HTML 字符实体的“标准答案”。它开箱即用、语义明确、性能可靠。在构建网页信息提取流水线(如 curl → grep → python -c "html.unescape(...)")时,应作为解码环节的首选工具,避免手动正则替换或错误使用 codecs.decode(..., 'unicode_escape') 等不适用方法。











