做爬虫时候遇到的中文字符编码问题(Python)

时间:2021-11-17 07:45:19

     最近在用python爬豆瓣电影数据,一如既往的采用BeautifulSoup,遇到的问题很多。在爬数据时候,很多例外没考虑到,比如豆瓣上有的电影主页压根没用上映时间,用户名缺失等一系列例外。当我一个个修复这些bug后,信心满满以为可以结束工作,喝着咖啡,只需看着自己的小爬虫自己自动的爬取网页数据的时候,我发现我错了。当数据爬取下来的时候,就是写入文件的问题。中文字符竟然出现了无法写入?

    因为之前,没怎么在python下往文件写入中文,没什么经验。在网上搜了一堆资料,才知道原因所在:编码问题。

   在python 2.x系列中,有两种类型的字符串:str和unicode。因为涉及到中文问题,我把文件打开函数openfilename,'w')换成:codecs.open(filename,'w','utf-8'),采用utf-8编码。同时在源文件头注明:#-*- coding: UTF-8 -*-。unicode编码类似这样的格式:u'\u6c49',str类型的字符串编码类似:’\xe4\xbd\xa0\xe5\xa5\xbd‘(utf-8编码)。我直接把unicode编码的字符直接写入文件,发现没问题。但是str类型的字符却无法写入,所以对str类型的字符串还得先进行解码,转换成unicode编码:如s.decode('UTF-8')。通过以上修改后,中文字符写入成功。

  另外,对于编码细节说明如下:

   str和unicode都是basestring的子类。严格意义上说,str其实是字节串,它是unicode经过编码后的字节组成的序列。

   模块codecs提供了一个open()方法,可以指定一个编码打开文件,使用这个方法打开的文件读取返回的将是unicode。写入时,如果参数是unicode,则使用open()时指定的编码进行编码后写入;如果是str,则先根据源代码文件声明的字符编码,解码成unicode后再进行前述操作。相对内置的open()来说,这个方法比较不容易在编码上出现问题。

  函数 decode( char_set )可以实现 其它编码到 Unicode 的转换,函数 encode( char_set )实现 Unicode 到其它编码方式的转换。  比如 ("你好").decode( "GB2312") 将得到 u'\u4f60\u597d',即 "你"和“好"的 Unicode 码分别是 0x4f60 和 0x597d。再用 (u'\u4f60\u597d').encode("UTF-8") 将得到 '\xe4\xbd\xa0\xe5\xa5\xbd',它是  “你好”的UTF-8编码结果。


  以上,是自己对python中文字符编码的一些总结。

--------------------------------------------------------------------------------------------------------------------------------------------------遇到问题,解决他,获得提升。


参考博文网址:

【1】http://www.2cto.com/kf/201203/124951.html

【2】http://www.cnblogs.com/huxi/archive/2010/12/05/1897271.html