- 論壇徽章:
- 0
|
小弟是新手,在用beautifulsoup抓取數(shù)據(jù)寫入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對應的網(wǎng)頁建立一個beautifulsoup對象
page2.close()
name = soup.find(attrs = {"class":"books"}).find(attrs ={"class":"bookContent"}).find("class":"titlein").text #解析某本書的書名
n1 = name.decode("gbk") #由于網(wǎng)頁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")
總的來說,我是這樣想的:數(shù)據(jù)在傳遞時都是比特流,只是不同的編碼方式會將其映射到不同的文字,
解碼就是把比特流變成文字,編碼就是把文字變成比特流
代碼中的name在網(wǎng)頁中是按gbk編碼的,所以寫代碼時,應按gbk將其解碼,再按utf8將其編碼送入utf8方式打開的文件,變成按utf8編碼的文字
但是,用cmd執(zhí)行后,打開csv發(fā)現(xiàn)結果是亂碼:鑴e簮鑴㈣劙鍗よ劆鑴屾病鎺寵劌紕岃剹
請問這是怎么回事呢?各位高手,我想了一晚上,底子太淺,實在沒想通,望指點,感激不盡! |
|