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:
Weitere Artikel zum Problem des verstümmelten Codes beim Crawlen und Speichern von HTML-Seiten durch Python finden Sie auf der chinesischen PHP-Website!