標籤:
昨天在幫同學解析一批從網路上爬取的檔案時,遇到一個奇葩的問題,檔案本身的編碼是gbk,Eclipse編輯環境的預設編碼是utf8,使用常規的open方法批量開啟檔案時,某些檔案中存在一些不可被gbk識別的特殊字元導致讀取錯誤,而這些特殊字元又是存在於utf8編碼中的。經不斷嘗試,發現一個很好的解決辦法:使用Python內建的codecs。codecs就是為編碼轉碼而生的,關於此功能的更多詳情請移步 https://docs.python.org/3.2/library/codecs.html
# -*- coding: utf8 -*- #以下代碼要實現的效果是將gbk編碼的檔案批量轉存為utf8編碼的檔案import os;import codecs;from bs4 import BeautifulSoup;#以gb18030編碼讀檔案的函數def ReadFile(filePath,encoding="gb18030"): #注意這裡的編碼格式 with codecs.open(filePath,"r",encoding) as f: return f.read()#以utf8編碼重新寫檔案的函數 def WriteFile(filePath,u,encoding="utf-8"): with codecs.open(filePath,"w",encoding) as f: f.write(u)fileList=os.listdir("E:/content/"); #擷取原檔案清單for eachFile in fileList: #遍曆檔案名稱 temp=ReadFile("E:/content/"+eachFile); #讀檔案 WriteFile(‘E:/content_0629/‘+eachFile, temp, "utf8"); #將讀取的內容轉存為utf8編碼的檔案print(‘finished.‘)
另外,檔案完成轉存之後,在使用BeautifulSoup進行解析時,想過濾掉一些雜訊資訊,完整代碼如下:
# -*- coding: utf8 -*- import os;from bs4 import BeautifulSoup;n=0;fileList=os.listdir("E:/content_0629");for eachFile in fileList: n=n+1; #設定檔案序號 rawText= open(r"E:/content_0629/"+eachFile,‘r‘,encoding=‘utf8‘);#讀檔案 bs4Text=BeautifulSoup(rawText);#調用BeautifulSoup進行解析 title=bs4Text.find(‘h2‘); #h2標籤中放的是文章本文標題 if(title==None): #判斷標題標籤是否存在,如果不存在則忽略當前檔案 continue; else: title=title.get_text(); #擷取標題內容文本 title=title.replace(" ","");#替換掉其中的全形空格 title=title.replace(" ","");#替換掉其中的半形空格 mainContent=bs4Text.find(‘div‘,{‘class‘:‘content‘}); #根據標籤名和標籤屬性值擷取本文內容標籤 if(mainContent==None):#判斷此標籤是否存在,如果不存在則忽略當前檔案 continue; else: mainContent=mainContent.get_text(); mainContent=mainContent.replace(" ",""); mainContent=mainContent.replace(" ",""); mainContent=mainContent.replace("\t",""); mainContent=‘\n‘.join(mainContent.split()) #將多個連續的空行替換為一個空行 #將解析後的文本儲存到檔案中,仍以utf8編碼 fwriter=open(‘E:/result_0629/resutl_‘+str(n)+".txt",‘w‘,encoding=‘utf8‘); fwriter.write(title+"\n"+mainContent); fwriter.close(); print(‘finished.‘)
著作權聲明:本文為博主原創文章,未經博主允許不得轉載。
Python中可避免讀寫亂碼的一個強大方法