Pythonを使用してHTMLページをキャプチャして保存すると、キャプチャしたWebページのコンテンツが文字化けするという問題がよく発生します。この問題の理由は、一方では独自のコードのエンコード設定に問題があり、他方ではエンコード設定が正しい場合でも、Web ページの実際のエンコードがマークされたエンコードと一致しないことです。エンコーディング。 HTML ページ マークのエンコードはここにあります:
コードをコピーします コードは次のとおりです:
これは簡単な解決策です。chardet を使用して Web ページの実際のエンコーディングを決定し、同時に URL リクエストによって返された情報からエンコーディングを決定します。 2 つのエンコーディングが異なる場合は、bs モジュールを使用して GB18030 エンコーディングに拡張します。同じ場合は、ファイルを直接書き込みます (システムのデフォルトのエンコーディングはここでは 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.php.cn' download(url)
取得した test.html ファイルを次のように開くと、設定したデフォルトのエンコーディングである UTF-8 BOM フリー エンコーディング形式で保存されていることがわかります。グラブ また、HTMLページ保存時の文字化けに関する関連記事は、PHPの中国語サイトに注目してください!