Maison  >  Article  >  développement back-end  >  Une brève discussion sur le traitement d'encodage des pages Web d'exploration Python

Une brève discussion sur le traitement d'encodage des pages Web d'exploration Python

高洛峰
高洛峰original
2017-02-22 11:13:222328parcourir

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

.

Une brève discussion sur le traitement dencodage des pages Web dexploration Python

<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(&#39;utf8&#39;)

<.>

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(&#39;utf8&#39;)

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

Les résultats imprimés sont les suivants :

ISO-8859-1

En 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(&#39;utf8&#39;)

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

Le résultat imprimé est évident, et les caractères chinois s'affichent correctement.

Une brève discussion sur le traitement dencodage des pages Web dexploration Python

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(&#39;utf8&#39;)

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 !

Déclaration:
Le contenu de cet article est volontairement contribué par les internautes et les droits d'auteur appartiennent à l'auteur original. Ce site n'assume aucune responsabilité légale correspondante. Si vous trouvez un contenu suspecté de plagiat ou de contrefaçon, veuillez contacter admin@php.cn