最新消息:20210816 当前crifan.com域名已被污染,为防止失联,请关注(页面右下角的)公众号

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

Python crifan 4385浏览 0评论

【背景】

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 <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了。

 

【其他相关内容供参考】

Python专题教程:BeautifulSoup详解

Python专题教程:抓取网站,模拟登陆,抓取动态网页

(里面包含了相关的,抓取的逻辑,html的charset,json等等相关的内容)

Python专题教程:字符串和字符编码

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

转载请注明:在路上 » 【问题解答】python爬虫保存为txt的编码问题求解决?

发表我的评论
取消评论

表情

Hi,您需要填写昵称和邮箱!

  • 昵称 (必填)
  • 邮箱 (必填)
  • 网址
89 queries in 0.182 seconds, using 22.03MB memory