Maison > Article > développement back-end > Une brève discussion sur le traitement d'encodage des pages Web d'exploration Python
Contexte
Pendant la fête de la mi-automne, un ami m'a envoyé un e-mail me disant que lorsqu'il escaladait Lianjia, il avait découvert que les codes renvoyés par le Web Les pages étaient toutes brouillées. Il m'a demandé de l'aider avec ses conseils (faire des heures supplémentaires pendant la Fête de la Mi-Automne, donc dédié = =!) En fait, j'ai rencontré ce problème très tôt, je l'ai lu un peu quand je l'ai lu. Je lisais des romans, mais je ne l'ai pas pris au sérieux. En fait, ce problème est dû à une mauvaise compréhension du codage.
Problème
Un code de robot très courant, le code est comme ceci :
# 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
Le but est en fait très simple, il s'agit d'explorer le contenu de Lianjia. Cependant, après avoir exécuté cette opération, les résultats renvoyés, y compris tout le contenu impliquant le chinois, deviendront tronqués, comme celui-ci
.
<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>
De telles données sont inutiles.
Analyse du problème
Le problème ici est évident, c'est-à-dire que l'encodage du texte est incorrect, ce qui entraîne des caractères tronqués.
Afficher l'encodage de la page Web
À en juger par l'en-tête de la page Web cible explorée, la page Web est codée avec utf-8.
<meta http-equiv="Content-Type" content="text/html; charset=utf-8">
Donc, il faut utiliser utf-8 pour l'encodage final, c'est à dire, le traitement final du texte, Utiliser utf- 8 à décoder, c'est-à-dire : decode('utf-8')
Encodage et décodage de texte
Encodage Python Le processus de décodage est comme this. Fichier source ===》 encode (méthode d'encodage) ===》decode (méthode de décodage) Dans une large mesure, il n'est pas recommandé d'utiliser
import sys reload(sys) sys.setdefaultencoding('utf8')
<.>
Cette façon de traiter en dur l'encodage du texte. Cependant, la paresse n'est pas un gros problème si elle ne vous affecte pas à certains moments. Cependant, il est recommandé d'utiliser l'encodage et le décodage pour traiter le texte après avoir obtenu le fichier source.Retour au problème
Le plus gros problème maintenant est la méthode d'encodage du fichier source. Lorsque nous utilisons normalement les requêtes, elles le seront automatiquement. devinez la source La méthode d'encodage du fichier est ensuite transcodée en encodage Unicode. Cependant, après tout, il s'agit d'un programme et il est possible de se tromper, donc si nous nous trompons, nous devons spécifier manuellement la méthode d'encodage. Le document officiel le décrit comme suit : Lorsque vous faites une requête, Requests fait des suppositions éclairées sur le codage de la réponse en fonction des en-têtes HTTP. Le codage de texte deviné par Requests est utilisé lorsque vous accédez à r.text. . Vous pouvez découvrir quel encodage les requêtes utilisent et le modifier à l'aide de la propriété r.encoding.Nous devons donc vérifier quelle méthode d'encodage est renvoyée par les requêtes ?
# 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.encodingLes résultats imprimés sont les suivants : ISO-8859-1En d'autres termes, le fichier source est codé selon ISO-8859-1. Baidu a recherché ISO-8859-1 et les résultats sont les suivants : ISO8859-1, généralement appelé Latin-1. Latin-1 comprend des caractères supplémentaires indispensables à l'écriture de toutes les langues d'Europe occidentale.
Problème résolu
Après avoir découvert ce genre de choses, le problème est facilement résolu. Spécifiez simplement l'encodage et vous pouvez taper correctement le chinois. Le code est le suivant :# 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.textLe résultat imprimé est évident, et les caractères chinois s'affichent correctement. Une autre façon consiste à décoder et encoder le fichier source. Le code est le suivant :
# 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')
.
Autre : ISO-8859-1 est également appelé latin1, et il est normal d'utiliser latin1 pour décoder les résultats. Il y a beaucoup de choses à dire sur l'encodage des caractères. Les amis qui souhaitent en savoir plus peuvent se référer aux informations suivantes. •"Le minimum absolu que tout développeur de logiciels doit absolument connaître sur l'Unicode et les jeux de caractères (pas d'excuses !)" L'article ci-dessus traite brièvement du traitement de codage des pages Web d'exploration Python. J'ai compilé tout le contenu partagé avec vous. J'espère qu'il pourra vous donner une référence. J'espère également que vous soutiendrez le site Web PHP chinois. Pour plus d'articles sur le codage et le traitement des pages Web d'exploration avec Python, veuillez faire attention au site Web PHP chinois !