近日,在用beautifulsoup进行数据的抓取及解析时,发现汉字的解析是个问题,总是出现乱码。
问题描述
比如解析 网站 http://www.biketo.com/
GB2312
乱码
soup=BeautifulSoup(response,"lxml")
print soup.title
打印的标题直接乱码: <title>缇庨獞缃憒Biketo.com_鑷杞﹂棬鎴风綉绔檁瀹岀編楠戣浠庤繖閲屽紑濮嬶紒
</title>
代码修改1
而后查看上述网页的源码: 为
charset=gb2312"于是修改代码:
soup=BeautifulSoup(response,"lxml",from_encoding="gb2312")
print soup.title.encode('gb2312')
增加encode的功能,则可以正常显示了: <title>美骑网|Biketo.com_自行车门户网站_完美骑行从这里开始!</title>
代码修改2
或者修改为
soup=BeautifulSoup(response,"lxml",from_encoding="utf-8")
print soup.title.encode('gb2312')
也是可以正常显示的。
代码修改3
soup=BeautifulSoup(response,"lxml")
print soup.title.encode('gb2312')
上述三个修改都是可以正常
UTF-8
对于另外一个网站: https://movie.douban.com/chart
其源码显示:
charset=utf-8
代码修改1
于是修改代码为:
soup=BeautifulSoup(response,"lxml",from_encoding="utf8")
print soup.title.encode('utf-8')
依然是乱码
代码修改2
关键是第二行中用的编码
soup=BeautifulSoup(response,"lxml")
print soup.title.encode('gb18030')
总结
实际上中文的编码经过了GB2312 GBK GB18030的三个阶段。而对于UTF-8是国际标准的编码,实际上豆瓣在网页源码显示UTF-8并不准确。因为最后是通过GB18030才解析OK,但是浏览器为什么解析的不是乱码呢?浏览器可能还通过其他字段做了进一步的解析。
经过实践,对于标示为gb2312的BIKETO,其也可以同gb18030的编码!
参考资料
1. 编码格式简介(ANSI、GBK、GB2312、UTF-8、GB18030和 UNICODE)