html实体(如

requests返回的HTML里有
这是因为HTML实体(如 、<code>"、&)不是原始文本,而是编码后的表示;直接当普通字符串处理,要么漏掉、要么多转一次,导致内容错乱。比如 < 实际是 的双重编码,硬解会变成 <code> 再变空或报错。
正确做法是交给专门的HTML解析器统一解码,别自己手写 .replace() 链:
如果你了解HTML,CSS和JavaScript,您已经拥有所需的工具开发Android应用程序。本动手本书展示了如何使用这些开源web标准设计和建造,可适应任何Android设备的应用程序 - 无需使用Java。您将学习如何创建一个在您选择的平台的Android友好的网络应用程序,然后转换与自由PhoneGap框架到一个原生的Android应用程序。了解为什么设备无关的移动应用是未来的潮流,并开始构建应用程序,提供更
- 用
html.unescape()最轻量,适合纯文本提取后清理(如从BeautifulSoup.get_text()结果里再清理) - 用
BeautifulSoup自动解码——只要用标准解析器(html.parser或lxml),它内部已调用解码逻辑,标签内文本默认就是可读状态 - 避免对原始响应体(
response.text)先html.unescape()再喂给BeautifulSoup,这会导致重复解码,<变成后被误认为标签起始
BeautifulSoup解析后,text属性里还是出现 、—这类符号
这是常见误解:BeautifulSoup 确实会解码标准实体(、<code>&),但像 、— 这些属于HTML 4/5规范里的“命名字符引用”,部分老版本解析器(尤其 html.parser)默认不全支持,或者在特定上下文里保留原样。
稳妥解法是在获取文本后统一过一遍 html.unescape():
from bs4 import BeautifulSoup
import html
<p>soup = BeautifulSoup(response.text, 'html.parser')
raw<em>text = soup.find('div', class</em>='content').get_text()
clean_text = html.unescape(raw_text) # 这步不能省</p>
-
lxml解析器对命名实体支持更好,但仍有边缘情况(比如自定义DTD或非标准实体),所以html.unescape()仍是兜底动作 - 别依赖
soup.decode()或str(soup),它们输出的是HTML源码字符串,不是解码后的文本 - 如果页面声明了
<meta charset="gb2312">浣
Python免费学习笔记(深入):立即使用
在学习笔记中,你将探索 Python 的核心概念和高级技巧!










