国产探花免费观看_亚洲丰满少妇自慰呻吟_97日韩有码在线_资源在线日韩欧美_一区二区精品毛片,辰东完美世界有声小说,欢乐颂第一季,yy玄幻小说排行榜完本

首頁 > 編程 > Python > 正文

python抓取網頁時字符集轉換問題處理方案分享

2020-02-23 05:30:02
字體:
來源:轉載
供稿:網友

問題提出:

    有時候我們采集網頁,處理完畢后將字符串保存到文件或者寫入數據庫,這時候需要制定字符串的編碼,如果采集網頁的編碼是gb2312,而我們的數據庫是utf-8的,這樣不做任何處理直接插入數據庫可能會亂碼(沒測試過,不知道數據庫會不會自動轉碼),我們需要手動將gb2312轉換成utf-8。

首先我們知道,python里的字符默認是ascii碼,英文當然沒問題啦,碰到中文的時候立馬給跪。

不知道你還記不記得,python里打印中文漢字的時候需要在字符串前面加 u:

print u"來搞基嗎?"

這樣子中文才能顯示,這里面的u的作用就是將后面的字符串轉換為unicode碼,這樣中文才能得到正確的顯示。
這里與之相關的有一個unicode()函數,用法如下

str="來搞基"str=unicode(str,"utf-8")print str

與u的區別是,這里用unicode將str轉換為unicode編碼,需要正確指定第二個參數,這里的utf-8是我test.py腳本自身的文件字符集,默認的可能是ansi。
unicode這是一個關鍵,下面繼續

我們開始抓取百度首頁,注意,游客訪問百度首頁,查看網頁源代碼,它的charset=gb2312。

import urllib2def 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源代碼,由于網頁默認的字符集是gb2312,所以如果我們直接保存到文件中,文件編碼將是ansi。

對于大部分人來說,其實這就足夠了,但是有時候我就想把gb2312轉換成utf-8的該怎么辦呢?

首先:
    str=unicode(str,"gb2312") #這里的gb2312就是str的實際字符集,我們現在將其轉換成unicode

然后:
    str=str.encode("utf-8") #將unicode的字符串重新編碼成utf-8

最后:

    將str寫入到文件中,打開文件看一下編碼屬性,發現是utf-8的了,把<meta charset="gb2312"改成<meta charset="utf-8" ,就是一個utf-8的網頁了。做了這么多其實就完成了一個gb2312->utf-8的轉碼。


總結:

    我們回顧一下,如果需要將字符串按照指定的字符集保存,有以下幾個步驟:

    1:用unicode(str,"原來的編碼")將str解碼成unicode字符串

    2:將unicode字符串str 使用 str.encode("指定的字符集") 轉換成你指定的字符集

    3:將str保存文件,或者寫入數據庫等操作,當然,編碼你已經指定了,不是嗎?

發表評論 共有條評論
用戶名: 密碼:
驗證碼: 匿名發表
主站蜘蛛池模板: 垣曲县| 金溪县| 神池县| 乃东县| 新建县| 灵武市| 扎赉特旗| 崇义县| 扎鲁特旗| 历史| 吴忠市| 济南市| 丹江口市| 新巴尔虎右旗| 贵溪市| 江门市| 都兰县| 洮南市| 醴陵市| 防城港市| 常州市| 兰考县| 江北区| 广东省| 肇庆市| 许昌市| 宁武县| 临洮县| 巴青县| 沾益县| 安阳县| 沽源县| 山丹县| 广丰县| 余庆县| 苏尼特左旗| 镇巴县| 平安县| 叶城县| 迭部县| 陇南市|