python抓取并保存html頁面時亂碼問題的解決方法
本文實(shí)例講述了python抓取并保存html頁面時亂碼問題的解決方法。分享給大家供大家參考,具體如下:
在用Python抓取html頁面并保存的時候,經(jīng)常出現(xiàn)抓取下來的網(wǎng)頁內(nèi)容是亂碼的問題。出現(xiàn)該問題的原因一方面是自己的代碼中編碼設(shè)置有問題,另一方面是在編碼設(shè)置正確的情況下,網(wǎng)頁的實(shí)際編碼和標(biāo)示的編碼不符合造成的。html頁面標(biāo)示的編碼在這里:
這里提供一種簡單的辦法解決:使用chardet判斷網(wǎng)頁的真實(shí)編碼,同時從url請求返回的info判斷標(biāo)示編碼。如果兩種編碼不同,則使用bs模塊擴(kuò)展為GB18030編碼;如果相同則直接寫入文件(這里設(shè)置系統(tǒng)默認(rèn)編碼為utf-8)。
import urllib2
import sys
import bs4
import chardet
reload(sys)
sys.setdefaultencoding('utf-8')
def download(url):
htmlfile = open('test.html','w')
try:
result = urllib2.urlopen(url)
content = result.read()
info = result.info()
result.close()
except Exception,e:
print 'download error!!!'
print e
else:
if content != None:
charset1 = (chardet.detect(content))['encoding'] #real encoding type
charset2 = info.getparam('charset') #declared encoding type
print charset1,' ', charset2
# case1: charset is not None.
if charset1 != None and charset2 != None and charset1.lower() != charset2.lower():
newcont = bs4.BeautifulSoup(content, from_encoding='GB18030') #coding: GB18030
for cont in newcont:
htmlfile.write('%s\n'%cont)
# case2: either charset is None, or charset is the same.
else:
#print sys.getdefaultencoding()
htmlfile.write(content) #default coding: utf-8
htmlfile.close()
if __name__ == "__main__":
url = 'http://www.dhdzp.com'
download(url)
得到的test.html文件打開如下,可以看到使用的是UTF-8無BOM編碼格式存儲的,也就是我們設(shè)置的默認(rèn)編碼:

更多關(guān)于Python相關(guān)內(nèi)容感興趣的讀者可查看本站專題:《Python編碼操作技巧總結(jié)》、《Python圖片操作技巧總結(jié)》、《Python數(shù)據(jù)結(jié)構(gòu)與算法教程》、《Python Socket編程技巧總結(jié)》、《Python函數(shù)使用技巧總結(jié)》、《Python字符串操作技巧匯總》、《Python入門與進(jìn)階經(jīng)典教程》及《Python文件與目錄操作技巧匯總》
希望本文所述對大家Python程序設(shè)計有所幫助。
相關(guān)文章
Python使用combinations實(shí)現(xiàn)排列組合的方法
今天小編就為大家分享一篇Python使用combinations實(shí)現(xiàn)排列組合的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-11-11
Python關(guān)于__name__屬性的含義和作用詳解
在本篇文章里小編給大家分享的是關(guān)于Python關(guān)于__name__屬性的含義和作用知識點(diǎn),需要的朋友們可以參考下。2020-02-02
python內(nèi)置HTTP Server如何實(shí)現(xiàn)及原理解析
這篇文章主要為大家介紹了python內(nèi)置HTTP Server如何實(shí)現(xiàn)及原理解析,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進(jìn)步,早日升職加薪2023-11-11
Python實(shí)現(xiàn)計算兩個時間之間相差天數(shù)的方法
這篇文章主要介紹了Python實(shí)現(xiàn)計算兩個時間之間相差天數(shù)的方法,涉及Python針對日期時間的相關(guān)運(yùn)算操作技巧,需要的朋友可以參考下2017-05-05
Python3 中把txt數(shù)據(jù)文件讀入到矩陣中的方法
下面小編就為大家分享一篇Python3 中把txt數(shù)據(jù)文件讀入到矩陣中的方法,具有很好的參考價值,希望對大家有所幫助。一起跟隨小編過來看看吧2018-04-04

