【背景】
代码如下:# -*- 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
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()
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中的:
可知的:
此处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等等相关的内容)
(其中包含了,基本的原理,常见的编码错误及解决办法等等内容)