當(dāng)訪問?response.text
?時(shí),我們需要將響應(yīng)字節(jié)解碼為unicode文本表示。
默認(rèn)情況下,?httpx
?將使用響應(yīng)?Content-Type
?頭中包含的?charset
?信息來確定如何將響應(yīng)字節(jié)解碼為文本。
在響應(yīng)中不包含字符集信息的情況下,默認(rèn)行為是采用utf-8
?編碼,這是迄今為止互聯(lián)網(wǎng)上使用最廣泛的文本編碼。
為了更好地理解這一點(diǎn),讓我們從查看文本解碼的默認(rèn)行為開始...
import httpx
# 使用默認(rèn)配置實(shí)例化client
client = httpx.Client()
# 使用client...
response = client.get(...)
print(response.encoding) # 這將打印 Contnet-Type 中charset給定的字符集,或者打印“utf-8”
print(response.text) # 文本將使用Content-Type中charset設(shè)定的字符集進(jìn)行解碼,或使用“utf-8”。
這通常是絕對沒問題的。大多數(shù)服務(wù)器將使用格式正確的 Content-Type 標(biāo)頭(包括字符集編碼)進(jìn)行響應(yīng)。在不包含字符集編碼的大多數(shù)情況下,UTF-8很可能被使用,因?yàn)樗粡V泛采用。
在某些情況下,我們可能會向服務(wù)器未顯式設(shè)置字符集信息的站點(diǎn)發(fā)出請求,但我們知道編碼是什么。在這種情況下,最好在client上顯式設(shè)置默認(rèn)編碼。
import httpx
# 使用中文字符集作為默認(rèn)編碼實(shí)例化client。
client = httpx.Client(default_encoding="GBK")
# 使用client...
response = client.get(...)
print(response.encoding) # 這將打印 Contnet-Type 中charset給定的字符集,或者打印“GBK”
print(response.text) # 文本將使用Content-Type中charset設(shè)定的字符集進(jìn)行解碼,或使用“GBK”。
如果服務(wù)器不能可靠地包含字符集信息,并且我們不知道正在使用哪種編碼,我們可以啟用自動(dòng)檢測,以便在從字節(jié)解碼為文本時(shí)進(jìn)行最佳猜測嘗試。
若要使用自動(dòng)檢測,需要將?default_encoding
?參數(shù)設(shè)置為可調(diào)用參數(shù)而不是字符串。這個(gè)可調(diào)用的應(yīng)該是一個(gè)函數(shù),它將輸入字節(jié)作為參數(shù),并返回用于將這些字節(jié)解碼為文本的字符集。
有兩個(gè)廣泛使用的Python包都可以處理此功能:
chardet
?激發(fā),采用不同的方法。讓我們看一下如何使用這些軟件包之一安裝自動(dòng)檢測...
pip install chardet
安裝后,我們可以將Client配置為使用chardet字符集自動(dòng)檢測。
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) # 這將打印內(nèi)容類型字符集中給定的字符集,或者打印自動(dòng)檢測的字符集。
print(response.text)
更多建議: