中文Unicode问题?

2024-05-23 15:23:14 发布

您现在位置:Python中文网/ 问答频道 /正文

从这个网站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,结果是°Ù¶È»ã×Ü


Tags: comhttpdata网站mainuvengineutf
1条回答
网友
1楼 · 发布于 2024-05-23 15:23:14

服务器不会在响应头中告诉您任何有用的信息,但HTML页面本身包含:

<meta http-equiv="Content-Type" content="text/html; charset=gb2312" />

GB2312是一种可变宽度编码,与UTF-8类似。然而,该页是假的;实际上它使用了GBK,它是GB2312的扩展。在

你可以很好地用GBK解码:

^{pr2}$

使用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')

因此,当使用GB2312时,对于那些只在GBK中定义的码位,解码错误被掩盖了。在

注意,beauthulsoup可以自己完成解码;它将找到meta头:

>>> soup = BeautifulSoup(r.content)
WARNING:root:Some characters could not be decoded, and were replaced with REPLACEMENT CHARACTER.

此警告是由于页面声明使用GB2312时使用的GBK代码点引起的。在

相关问题 更多 >