【背景】
代码如下:
# -*- coding: utf-8 -*- #http://www.qiushibaike.com/8hr/page/1?s=4603425 import urllib2 from bs4 import BeautifulSoup page=1 xiubai=open(r'xiubai.txt','w+') for page in range(1,11): url="http://www.qiushibaike.com/8hr/page/"+str(page)+"?s=4603425" soup = BeautifulSoup(urllib2.urlopen(url).read()) for result in soup.findAll("div", "content", title=True): xiubai.write(result.text)
报错:
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使用方法示例:
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中的:
<meta http-equiv="Content-Type" content="text/html; charset=utf-8" />
可知的:
此处html(字符串)的编码为utf-8
(2)传递给BeautifulSoup去解析为soup
由于BeautifulSoup默认是utf-8,所以无需再指定encoding:
soup = BeautifuSoup(yourHtml)
否则,应该写成:
soup = BeautifuSoup(yourHtml, fromEncoding=yourHtmlCharset)
比如:
soup = BeautifuSoup(yourHtml, fromEncoding="GBK")
(3)从find处理的soup节点,通过get_text()获得对应的内容
(4)将获得的字符串内容,用codes保存到文件
大概代码为:
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的编码问题求解决?