ホームページ > バックエンド開発 > Python チュートリアル > PythonでHTMLページをキャプチャして保存すると文字化けが発生する問題

PythonでHTMLページをキャプチャして保存すると文字化けが発生する問題

高洛峰
リリース: 2017-03-01 13:25:22
オリジナル
1677 人が閲覧しました

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の中国語サイトに注目してください!

関連ラベル:
ソース:php.cn
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート