【背景】
代码如下:
1 2 3 4 5 6 7 8 9 10 11 | # -*- coding: utf-8 -*- import urllib2 from bs4 import BeautifulSoup page = 1 xiubai = open (r 'xiubai.txt' , 'w+' ) for page in range ( 1 , 11 ): soup = BeautifulSoup(urllib2.urlopen(url).read()) for result in soup.findAll( "div" , "content" , title = True ): xiubai.write(result.text) |
报错:
1 2 3 4 | Traceback (most recent call last): File "D:\python\python2.7.5\pythontest\爬虫\kanxiushibaike.py" , line 13 , in <module> xiubai.write(result.text) UnicodeEncodeError: 'ascii' codec can't encode characters in position 2 - 10 : ordinal not in range ( 128 ) |
【解答】
1.你这里用result.text,本身就是不好的做法,应该用result.get_text()
详见:【整理】BeautifulSoup中的.string和.text的区别
2.操作文件,读写数据,涉及到非ASCII的话,最好用codes模块操作,其会自动帮你处理不同的编码,效果最好。
codes使用方法示例:
1 2 3 4 5 6 7 8 | import codecs; yourStrToSave = "your data string" ; # 'a+': read,write,append # 'w' : clear before, then write outputFp = codecs. open ( "outputFile.txt" , 'w' , 'utf-8' ); outputFp.write(yourStrToSave); outputFp.flush(); outputFp.close(); |
3.对于你此处获得html,并用bs处理html的过程,实际上,更好的做法是:
(1)搞清楚本身html的charset
中的:【整理】关于HTML网页源码的字符编码(charset)格式(GB2312,GBK,UTF-8,ISO8859-1等)的解释
此处,从网页html中的:
1 | < meta http-equiv = "Content-Type" content = "text/html; charset=utf-8" /> |
可知的:
此处html(字符串)的编码为utf-8
(2)传递给BeautifulSoup去解析为soup
由于BeautifulSoup默认是utf-8,所以无需再指定encoding:
1 | soup = BeautifuSoup(yourHtml) |
否则,应该写成:
1 | soup = BeautifuSoup(yourHtml, fromEncoding = yourHtmlCharset) |
比如:
1 | soup = BeautifuSoup(yourHtml, fromEncoding = "GBK" ) |
(3)从find处理的soup节点,通过get_text()获得对应的内容
(4)将获得的字符串内容,用codes保存到文件
大概代码为:
1 2 3 4 5 6 7 8 9 | import codecs; # 'a+': read,write,append # 'w' : clear before, then write outputFp = codecs. open ( "outputFile.txt" , 'w' , 'utf-8' ); for result in soup.findAll( "div" , "content" , title = True ): outputFp.write(result.get_text()) outputFp.flush(); outputFp.close(); |
这样就可以正确处理字符编码的事情了。
其中,bs中通过get_text()得到的字符串,已经是unicode了。
【其他相关内容供参考】
(里面包含了相关的,抓取的逻辑,html的charset,json等等相关的内容)
(其中包含了,基本的原理,常见的编码错误及解决办法等等内容)
转载请注明:在路上 » 【问题解答】python爬虫保存为txt的编码问题求解决?