(三)从响应字节得到正确文本
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 文本编码