python爬虫编码问题,【问题解答】python爬虫保存为txt的编码问题求解决?

【背景】

代码如下:# -*- 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等等相关的内容)

(其中包含了,基本的原理,常见的编码错误及解决办法等等内容)

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值