Python 现代开发学习笔记

(三)从响应字节得到正确文本

1. 编码信息参与解码

练习站的 /legacy/ 用 gb18030 编码中文,并在响应头里声明它:

# 项目文件:demos/encoding.py
# 服务器声明 gb18030,HTTPX 据此把正文 bytes 解码为 Unicode 文本。
import httpx
from crawlsite import running_site


if __name__ == "__main__":
    with running_site() as site, httpx.Client(trust_env=False, timeout=1) as client:
        response = client.get(site.base_url + "/legacy/")
        response.raise_for_status()
        print(response.encoding)
        print(response.text)
        print(response.content.decode("gb18030") == response.text)

输出 gb18030、<h1>算法与书</h1> 和 True。HTML 解析器接下来处理的是这些 Unicode 字符;如果在解码时已经出现乱码,换一个 CSS 选择器不会把文字恢复。

响应头缺失或写错编码时,先保留原始 response.content,对照页面声明与实际字节核对编码。确定为 gb18030 后,可以用 .content.decode("gb18030") 明确解码;也可以在第一次读取 .text 之前设置 response.encoding = "gb18030"。HTTPX 已经缓存过文本后,再改 encoding 会反馈错误,因此先确认编码,再交给解析器。HTTPX 文本编码

相同正文字节依据响应编码恢复中文,再由HTML解析器建立标签结构

笔记正文与全部题解 · Ctrl / ⌘ K