服務器不會告訴你任何有用的響應標題,但HTML頁面本身包含:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
GB2312是可變寬度編碼,如UTF-8。但是頁面在於;它實際上使用GBK,這是GB2312的擴展。與gb2313
失敗
>>> len(r.content.decode('gbk'))
44535
>>> u'百度彙總' in r.content.decode('gbk')
True
解碼:
你可以用GBK就好解碼
>>> r.content.decode('gb2312')
Traceback (most recent call last):
File "<stdin>", line 1, in <module>
UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 26367-26368: illegal multibyte sequence
但由於GBK是GB2313的超集,它應該永遠是安全使用前即使在後者被指定時也是如此。
如果使用requests
,然後設置r.encoding
到gb2312
作品,因爲r.text
使用replace
處理時解碼錯誤:
content = str(self.content, encoding, errors='replace')
所以在使用GB2312被屏蔽只在GBK定義的那些碼點解碼錯誤。
請注意,BeautifulSoup可以自行完成解碼;它會找到meta
頭:
>>> soup = BeautifulSoup(r.content)
WARNING:root:Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
警告是由GBK碼點引起的,而網頁聲稱使用GB2312被使用。
頁面使用GBK,而不是UTF-8。 –
你怎麼弄出來的?請你給我看看。我在html中看到'utf-8'。 – jason
@jason_cant_code:第6行是'頁面上唯一帶有「utf-8」的地方聲明編碼導入的JavaScript。 – geoffspear