skywalker_32 发表于 2014-04-20 03:48

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

小弟是新手,在用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簮鑴㈣劙鍗よ劆鑴屾病鎺宠劌纰岃剹

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

lionfun 发表于 2014-04-20 11:23

本帖最后由 lionfun 于 2014-04-20 11:23 编辑

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

Jpython 发表于 2014-04-20 17:45

cmd 是GBK的,你直接试试decode('gbk'),不要再编成utf-8。
页: [1]
查看完整版本: python用beautifulsoup抓取数据写入csv文件时, 遇到了字符编码的问题