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

