免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 4354 | 回复: 2
打印 上一主题 下一主题

python用beautifulsoup抓取数据写入csv文件时, 遇到了字符编码的问题 [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2014-04-20 03:48 |只看该作者 |倒序浏览
小弟是新手,在用beautifulsoup抓取数据写入csv文件时,

遇到了字符编码的问题,自认想通了按思路改却总是会乱码,

望各路大侠指点

#coding=utf-8      #让这个python源文件按utf8编码

from __future__ import print_function

from bs4 import BeautifulSoup

import urllib2
import codecs
import sys
import re
reload(sys)               #以上是引入库
sys.setdefaultencoding("utf-8")
strFile='book.csv'                                
f = codecs.open(strFile,'w','utf-8')     #用写入方式打开按utf8编码的文档
f.write('bookname'+'\n')   # 写入一个属性
print("\nGetting data for page...",end='')
url="http://www.bookschina.com/publishtj/02_AA_5_1_2/"
page2=urllib2.urlopen(url)               
soup=BeautifulSoup(page2)   #将url对应的网页建立一个beautifulsoup对象
page2.close()
name = soup.find(attrs = {"class":"books"}).find(attrs ={"class":"bookContent"}).find("class":"titlein").text  #解析某本书的书名
n1 = name.decode("gbk")  #由于网页http://www.bookschina.com/publishtj/02_AA_5_1_2/的编码是GBK,所以由gbk解                                            码  
n2 = n1.encode("utf-8")   #再编码为utf8符合将要写入的文件的编码方式
f.write(n2+'\n')
print("\n done",end='')
f.close()
print("\n over")

总的来说,我是这样想的:数据在传递时都是比特流,只是不同的编码方式会将其映射到不同的文字,

解码就是把比特流变成文字,编码就是把文字变成比特流

代码中的name在网页中是按gbk编码的,所以写代码时,应按gbk将其解码,再按utf8将其编码送入utf8方式打开的文件,变成按utf8编码的文字

但是,用cmd执行后,打开csv发现结果是乱码:鑴e簮鑴㈣劙鍗よ劆鑴屾病鎺宠劌纰岃剹

请问这是怎么回事呢?各位高手,我想了一晚上,底子太浅,实在没想通,望指点,感激不尽!

论坛徽章:
0
2 [报告]
发表于 2014-04-20 11:23 |只看该作者
本帖最后由 lionfun 于 2014-04-20 11:23 编辑

如果不是utf-8需要告诉BeautifulSoup网页编码:
  1. soup=BeautifulSoup(page2,from_encoding="gb18030")
复制代码
同时使用from_encoding="gb18030"也可以解决utf8网页编码

论坛徽章:
0
3 [报告]
发表于 2014-04-20 17:45 |只看该作者
cmd 是GBK的,你直接试试decode('gbk'),不要再编成utf-8。
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP