Heim  >  Artikel  >  Backend-Entwicklung  >  Problem mit verstümmelten Zeichen, wenn Python HTML-Seiten erfasst und speichert

Problem mit verstümmelten Zeichen, wenn Python HTML-Seiten erfasst und speichert

高洛峰
高洛峰Original
2017-03-01 13:25:221650Durchsuche

Bei der Verwendung von Python zum Erfassen und Speichern von HTML-Seiten besteht häufig das Problem, dass der Inhalt der erfassten Webseiten verstümmelt ist. Der Grund für dieses Problem liegt darin, dass einerseits ein Problem mit den Kodierungseinstellungen in Ihrem eigenen Code vorliegt und andererseits, wenn die Kodierungseinstellungen korrekt sind, die tatsächliche Kodierung der Webseite nicht mit der markierten übereinstimmt Codierung. Die auf der HTML-Seite markierte Codierung ist hier:

Kopieren Sie den Code Der Code lautet wie folgt:

Hier ist eine einfache Lösung: Verwenden Sie chardet, um die tatsächliche Kodierung der Webseite zu bestimmen und gleichzeitig die Markierung zu bestimmen Codierung aus den von der URL-Anfrage zurückgegebenen Informationen. Wenn die beiden Codierungen unterschiedlich sind, verwenden Sie das bs-Modul, um sie auf die GB18030-Codierung zu erweitern. Wenn sie identisch sind, schreiben Sie die Datei direkt (die Systemstandardcodierung ist hier auf utf-8 eingestellt).

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)

Die erhaltene test.html-Datei wird wie folgt geöffnet. Sie können sehen, dass sie im UTF-8-BOM-freien Codierungsformat gespeichert ist ist das, was wir festgelegt haben. Die Standardcodierung:

Problem mit verstümmelten Zeichen, wenn Python HTML-Seiten erfasst und speichert

Weitere Artikel zum Problem des verstümmelten Codes beim Crawlen und Speichern von HTML-Seiten durch Python finden Sie auf der chinesischen PHP-Website!

Stellungnahme:
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn