Hintergrund
Während des Mittherbstfestes schickte mir ein Freund eine E-Mail, in der er mir mitteilte, dass er beim Besteigen von Lianjia festgestellt habe, dass die Codes vom Internet zurückgegeben wurden Er hat mich gebeten, ihm mit seinem Rat zu helfen (ich mache Überstunden während des Mittherbstfestes, also bin ich schon sehr früh auf dieses Problem gestoßen, als ich es gelesen habe). Ich habe Romane gelesen, aber ich habe es nicht ernst genommen. Tatsächlich ist dieses Problem richtig. Verursacht durch mangelndes Verständnis der Codierung.
Problem
Ein sehr häufiger Crawler-Code, der Code sieht so aus:
# ecoding=utf-8 import re import requests import sys reload(sys) sys.setdefaultencoding('utf8') url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/' res = requests.get(url) print res.text
Der Zweck ist eigentlich sehr einfach, nämlich den Inhalt von Lianjia zu crawlen. Nach der Ausführung werden jedoch die zurückgegebenen Ergebnisse, einschließlich aller Inhalte mit Chinesisch, verstümmelt, wie beispielsweise dieser
<script type="text/template" id="newAddHouseTpl"> <p class="newAddHouse"> 自从您上次æµè§ˆï¼ˆ<%=time%>)之åŽï¼Œè¯¥æœç´¢æ¡ä»¶ä¸‹æ–°å¢žåŠ 了<%=count%>å¥—æˆ¿æº <a href="<%=url%>" class="LOGNEWERSHOUFANGSHOW" <%=logText%>><%=linkText%></a> <span class="newHouseRightClose">x</span> </p> </script>
Solche Daten sind nutzlos.
Problemanalyse
Das Problem hier ist offensichtlich, das heißt, die Kodierung des Textes ist falsch, was zu verstümmelten Zeichen führt.
Codierung der Webseite anzeigen
Dem Header der gecrawlten Zielwebseite nach zu urteilen, ist die Webseite mit utf-8 codiert.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Also müssen wir utf-8 für die endgültige Codierung verwenden, also für die endgültige Textverarbeitung. Verwenden Sie utf- 8 zum Dekodieren, das heißt: decode('utf-8')
Textkodierung und -dekodierung
Python-Kodierung Der Dekodierungsprozess ist wie folgt Dies. Quelldatei ===》 kodieren (Kodierungsmethode) ===》dekodieren (Dekodierungsmethode) Es wird weitgehend nicht empfohlen,
import sys reload(sys) sys.setdefaultencoding('utf8')
< zu verwenden 🎜>
Auf diese Weise wird die Textkodierung hart verarbeitet. Faulheit ist jedoch kein großes Problem, wenn sie zu bestimmten Zeiten keine Auswirkungen hat. Es wird jedoch empfohlen, den Text nach Erhalt der Quelldatei mit Kodierung und Dekodierung zu verarbeiten.Zurück zum Problem
Das größte Problem ist jetzt die Kodierungsmethode der Quelldatei, wenn wir Anfragen normal verwenden Erraten Sie die Quelle. Die Kodierungsmethode der Datei wird dann in die Unicode-Kodierung umgewandelt. Schließlich handelt es sich jedoch um ein Programm und es ist möglich, falsch zu raten. Wenn wir also falsch raten, müssen wir die Kodierungsmethode manuell angeben. Das offizielle Dokument beschreibt es wie folgt: Wenn Sie eine Anfrage stellen, macht Requests fundierte Vermutungen über die Kodierung der Antwort basierend auf den HTTP-Headern. Die von Requests erratene Textkodierung wird verwendet, wenn Sie auf r.text zugreifen . Mit der Eigenschaft r.encoding können Sie herausfinden, welche Codierung Requests verwendet, und diese ändern.Wir müssen also überprüfen, welche Codierungsmethode von Anfragen zurückgegeben wird?
# ecoding=utf-8 import re import requests from bs4 import BeautifulSoup import sys reload(sys) sys.setdefaultencoding('utf8') url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/' res = requests.get(url) print res.encoding
Problem gelöst
Nachdem Sie dieses Problem entdeckt haben, lässt sich das Problem leicht lösen. Geben Sie einfach die Kodierung an und Sie können Chinesisch richtig eingeben. Der Code lautet wie folgt:# ecoding=utf-8 import requests import sys reload(sys) sys.setdefaultencoding('utf8') url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/' res = requests.get(url) res.encoding = ('utf8') print res.text
# ecoding=utf-8 import requests import sys reload(sys) sys.setdefaultencoding('utf8') url = 'http://jb51.net/ershoufang/rs%E6%8B%9B%E5%95%86%E6%9E%9C%E5%B2%AD/' res = requests.get(url) # res.encoding = ('utf8') print res.text.encode('ISO-8859-1').decode('utf-8')
Anderes: ISO-8859-1 wird auch als Latin1 bezeichnet und es ist normal, Latin1 zum Dekodieren von Ergebnissen zu verwenden. Es gibt viel zu sagen über die Zeichenkodierung. Freunde, die mehr wissen möchten, können sich auf die folgenden Informationen beziehen. •„Das absolute Minimum, das jeder Softwareentwickler unbedingt über Unicode und Zeichensätze wissen muss (keine Ausreden!)“ Der obige Artikel geht kurz auf die Codierungsverarbeitung von Python-Crawling-Webseiten ein. Ich habe den gesamten mit Ihnen geteilten Inhalt zusammengestellt und hoffe, dass er Ihnen als Referenz dient. Ich hoffe auch, dass Sie die chinesische PHP-Website unterstützen. Weitere Artikel zum Codieren und Verarbeiten von Crawling-Webseiten mit Python finden Sie auf der chinesischen PHP-Website!