python抓取網(wǎng)頁時字符集轉(zhuǎn)換問題處理方案分享
問題提出:
有時候我們采集網(wǎng)頁,處理完畢后將字符串保存到文件或者寫入數(shù)據(jù)庫,這時候需要制定字符串的編碼,如果采集網(wǎng)頁的編碼是gb2312,而我們的數(shù)據(jù)庫是utf-8的,這樣不做任何處理直接插入數(shù)據(jù)庫可能會亂碼(沒測試過,不知道數(shù)據(jù)庫會不會自動轉(zhuǎn)碼),我們需要手動將gb2312轉(zhuǎn)換成utf-8。
首先我們知道,python里的字符默認(rèn)是ascii碼,英文當(dāng)然沒問題啦,碰到中文的時候立馬給跪。
不知道你還記不記得,python里打印中文漢字的時候需要在字符串前面加 u:
print u"來搞基嗎?"
這樣子中文才能顯示,這里面的u的作用就是將后面的字符串轉(zhuǎn)換為unicode碼,這樣中文才能得到正確的顯示。
這里與之相關(guān)的有一個unicode()函數(shù),用法如下
str="來搞基" str=unicode(str,"utf-8") print str
與u的區(qū)別是,這里用unicode將str轉(zhuǎn)換為unicode編碼,需要正確指定第二個參數(shù),這里的utf-8是我test.py腳本自身的文件字符集,默認(rèn)的可能是ansi。
unicode這是一個關(guān)鍵,下面繼續(xù)
我們開始抓取百度首頁,注意,游客訪問百度首頁,查看網(wǎng)頁源代碼,它的charset=gb2312。
import urllib2
def main():
f=urllib2.urlopen("http://www.baidu.com")
str=f.read()
str=unicode(str,"gb2312")
fp=open("baidu.html","w")
fp.write(str.encode("utf-8"))
fp.close()
if __name__ == '__main__' :
main()
解釋:
我們首先用urllib2.urlopen()方法將百度首頁抓取到,f是句柄 ,用str=f.read()將所有源代碼讀入str中
搞清楚,str里面就是我們抓取的html源代碼,由于網(wǎng)頁默認(rèn)的字符集是gb2312,所以如果我們直接保存到文件中,文件編碼將是ansi。
對于大部分人來說,其實這就足夠了,但是有時候我就想把gb2312轉(zhuǎn)換成utf-8的該怎么辦呢?
首先:
str=unicode(str,"gb2312") #這里的gb2312就是str的實際字符集,我們現(xiàn)在將其轉(zhuǎn)換成unicode
然后:
str=str.encode("utf-8") #將unicode的字符串重新編碼成utf-8
最后:
將str寫入到文件中,打開文件看一下編碼屬性,發(fā)現(xiàn)是utf-8的了,把<meta charset="gb2312"改成<meta charset="utf-8" ,就是一個utf-8的網(wǎng)頁了。做了這么多其實就完成了一個gb2312->utf-8的轉(zhuǎn)碼。
總結(jié):
我們回顧一下,如果需要將字符串按照指定的字符集保存,有以下幾個步驟:
1:用unicode(str,"原來的編碼")將str解碼成unicode字符串
2:將unicode字符串str 使用 str.encode("指定的字符集") 轉(zhuǎn)換成你指定的字符集
3:將str保存文件,或者寫入數(shù)據(jù)庫等操作,當(dāng)然,編碼你已經(jīng)指定了,不是嗎?
相關(guān)文章
tensorflow 用矩陣運(yùn)算替換for循環(huán) 用tf.tile而不寫for的方法
今天小編就為大家分享一篇tensorflow 用矩陣運(yùn)算替換for循環(huán) 用tf.tile而不寫for的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-07-07
Python入門學(xué)習(xí)之類的相關(guān)知識總結(jié)
今天帶大家復(fù)習(xí)python的基礎(chǔ)知識,文中對類的相關(guān)知識作了非常詳細(xì)的介紹,對正在學(xué)習(xí)python的小伙伴們有很好地幫助,需要的朋友可以參考下2021-05-05
Jupyter notebook命令和編輯模式常用快捷鍵匯總
這篇文章主要介紹了Jupyter notebook命令和編輯模式常用快捷鍵匯總,文中通過示例代碼介紹的非常詳細(xì),對大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價值,需要的朋友可以參考下2020-11-11
Python中.py文件打包成exe可執(zhí)行文件詳解
這篇文章主要給大家介紹了在Python中.py文件打包成exe可執(zhí)行文件的相關(guān)資料,文中介紹的非常詳細(xì),相信對大家具有一定的參考價值,需要的朋友們下面來一起看看吧。2017-03-03
對python中raw_input()和input()的用法詳解
下面小編就為大家分享一篇對python中raw_input()和input()的用法詳解,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04
使用python構(gòu)建WebSocket客戶端的教程詳解
WebSocket是一種在客戶端和服務(wù)器之間實現(xiàn)雙向通信的協(xié)議,常用于實時聊天、實時數(shù)據(jù)更新等場景,Python提供了許多庫來實現(xiàn) WebSocket客戶端,本教程將介紹如何使用Python構(gòu)建WebSocket客戶端,文中通過代碼示例給大家介紹的非常詳細(xì),需要的朋友可以參考下2023-12-12
python基于OpenCV模塊實現(xiàn)視頻流數(shù)據(jù)切割為圖像幀數(shù)據(jù)(流程分析)
這篇文章主要介紹了python基于OpenCV模塊實現(xiàn)視頻流數(shù)據(jù)切割為圖像幀數(shù)據(jù),這里今天主要是實踐一下視頻流數(shù)據(jù)的預(yù)處理工作,需要的朋友可以參考下2022-05-05

