从此网站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/

10-12 22:31