从此网站http://engine.data.cnzz.com/main.php?s=engine&uv=&st=2014-03-01&et=2014-03-31
<tr class="list03" onclick="showMen1(9);" style="cursor:pointer;">
<td id="e_9" class="qh_one">百度汇总</td>
我正在抓取文字并尝试获取
百度汇总
但是当我
r.encoding = 'utf-8'
的结果是�ٶȻ���
如果我不使用
utf-8
,则结果为°Ù¶È»ã×Ü
最佳答案
服务器不会在响应头中告诉您任何有用的信息,但是HTML页面本身包含:
<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />
GB2312是宽度可变的编码,类似于UTF-8。该页面位于;它实际上使用了GBK(GB2312的扩展名)。
您可以使用GBK对其进行解码:
>>> len(r.content.decode('gbk'))
44535
>>> u'百度汇总' in r.content.decode('gbk')
True
gb2313
解码失败:>>> 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')
因此,对于仅在GBK中定义的那些代码点,将掩盖使用GB2312时的解码错误。
注意,BeautifulSoup可以自己完成所有解码工作。它会找到
meta
标头:>>> soup = BeautifulSoup(r.content)
WARNING:root:Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.
该警告是由页面声称使用GB2312时使用的GBK代码点引起的。
关于python - 中文Unicode问题?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/23268480/