Python - BeautifulSoup 处理 gbk 编码解析差 - 中文网页抓取问题
我在玩一个脚本,代码如下:
# -*- coding: utf8 -*-
import codecs
from BeautifulSoup import BeautifulSoup, NavigableString,
UnicodeDammit
import urllib2,sys
import time
try:
import timeoutsocket # http://www.timo-tasi.org/python/timeoutsocket.py
timeoutsocket.setDefaultSocketTimeout(10)
except ImportError:
pass
h=u'\u3000\u3000\u4fe1\u606f\u901a\u4fe1\u6280\u672f'
address=urllib2.urlopen('http://stock.eastmoney.com/news/1408,20101022101395594.html').read()
soup=BeautifulSoup(address)
p=soup.findAll('p')
t=p[2].string[:10]
运行后得到的结果是:
print t
¡¡¡¡ÐÅϢͨ
print h
信息通
t
u'\xa1\xa1\xa1\xa1\xd0\xc5\xcf\xa2\xcd\xa8'
h
u'\u3000\u3000\u4fe1\u606f\u901a'
h.encode('gbk')
'\xa1\xa1\xa1\xa1\xd0\xc5\xcf\xa2\xcd\xa8'
简单来说,当我通过BeautifulSoup处理这个HTML时,它把GBK编码的文本当成了Unicode来处理,没有意识到需要先解码。虽然“h”和“t”应该是一样的,因为“h”只是我手动从HTML文件中提取的文本并进行了转换。
我该如何解决这个问题呢?
祝好
wheaton
1 个回答
5
这个文件的元标签说它使用的字符集是 GB2312,但是里面却有一个字符是来自更新版的 GBK 或 GB18030,这让BeautifulSoup处理起来有点麻烦:
simon@lucifer:~$ python Python 2.7 (r27:82508, Jul 3 2010, 21:12:11) [GCC 4.0.1 (Apple Inc. build 5493)] on darwin Type "help", "copyright", "credits" or "license" for more information. >>> import urllib2 >>> data = urllib2.urlopen('http://stock.eastmoney.com/news/1408,20101022101395594.html').read() >>> data.decode("gb2312") Traceback (most recent call last): File "", line 1, in UnicodeDecodeError: 'gb2312' codec can't decode bytes in position 20148-20149: illegal multibyte sequence
在这个时候,UnicodeDammit就放弃了,转而尝试 chardet、UTF-8,最后是 Windows-1252,而这个总是能成功 - 看起来就是这样。
如果我们告诉解码器把不认识的字符替换成一个'?',我们就能看到在GB2312中缺失的字符:
>>> print data[20140:20160].decode("gb2312", "replace") 毒尾气二�英的排放难
使用正确的编码:
>>> print data[20140:20160].decode("gb18030", "replace") 毒尾气二噁英的排放难 >>> from BeautifulSoup import BeautifulSoup >>> s = BeautifulSoup(data, fromEncoding="gb18030") >>> print s.findAll("p")[2].string[:10] 信息通信技术是&
还有:
>>> print s.findAll("p")[2].string 信息通信技术是“十二五”规划重点发展方向,行业具有很强的内在增长潜 力,增速远高于GDP。软件外包、服务外包、管理软件、车载导航、网上购物、网络游戏、 移动办公、移动网络游戏、网络视频等均存在很强的潜在需求,使信息技术行业继续保持较 高增长。