httpx 字符集编码和自动检测

2022-07-26 11:40 更新

当访问​response.text​时,我们需要将响应字节解码为unicode文本表示。

默认情况下,​httpx​将使用响应​Content-Type​头中包含的​charset​信息来确定如何将响应字节解码为文本。

在响应中不包含字符集信息的情况下,默认行为是采用utf-8​编码,这是迄今为止互联网上使用最广泛的文本编码。

使用默认编码

为了更好地理解这一点,让我们从查看文本解码的默认行为开始...

import httpx
# 使用默认配置实例化client
client = httpx.Client()
# 使用client...
response = client.get(...)
print(response.encoding)  # 这将打印 Contnet-Type 中charset给定的字符集,或者打印“utf-8”
print(response.text)  # 文本将使用Content-Type中charset设定的字符集进行解码,或使用“utf-8”。

这通常是绝对没问题的。大多数服务器将使用格式正确的 Content-Type 标头(包括字符集编码)进行响应。在不包含字符集编码的大多数情况下,UTF-8很可能被使用,因为它被广泛采用。

使用显式编码

在某些情况下,我们可能会向服务器未显式设置字符集信息的站点发出请求,但我们知道编码是什么。在这种情况下,最好在client上显式设置默认编码。

import httpx
# 使用中文字符集作为默认编码实例化client。
client = httpx.Client(default_encoding="GBK")
# 使用client...
response = client.get(...)
print(response.encoding)  # 这将打印 Contnet-Type 中charset给定的字符集,或者打印“GBK”
print(response.text)  #  文本将使用Content-Type中charset设定的字符集进行解码,或使用“GBK”。

使用字符集自动检测

如果服务器不能可靠地包含字符集信息,并且我们不知道正在使用哪种编码,我们可以启用自动检测,以便在从字节解码为文本时进行最佳猜测尝试。

若要使用自动检测,需要将​default_encoding​参数设置为可调用参数而不是字符串。这个可调用的应该是一个函数,它将输入字节作为参数,并返回用于将这些字节解码为文本的字符集。

有两个广泛使用的Python包都可以处理此功能:

让我们看一下如何使用这些软件包之一安装自动检测...

pip install chardet

安装后,我们可以将Client配置为使用chardet字符集自动检测。

import httpx
import chardet

def autodetect(content):
    return chardet.detect(content).get("encoding")

# Using a client with character-set autodetection enabled.
client = httpx.Client(default_encoding=autodetect)
response = client.get(...)
print(response.encoding)  # 这将打印内容类型字符集中给定的字符集,或者打印自动检测的字符集。
print(response.text)


以上内容是否对您有帮助:
在线笔记
App下载
App下载

扫描二维码

下载编程狮App

公众号
微信公众号

编程狮公众号