Maison  >  Article  >  développement back-end  >  Solution au problème de code tronqué dans le robot d'exploration Web Python

Solution au problème de code tronqué dans le robot d'exploration Web Python

高洛峰
高洛峰original
2017-02-11 13:13:461471parcourir

Cet article présente principalement en détail la solution au problème des caractères tronqués dans les robots d'exploration Web Python. Il a une certaine valeur de référence. Les amis intéressés peuvent s'y référer

Il existe de nombreuses façons de résoudre le problème des caractères tronqués. caractères dans les robots d'exploration. Divers problèmes, voici non seulement les caractères chinois tronqués, la conversion de l'encodage, mais aussi certains caractères tronqués tels que le japonais, le coréen, le russe, le tibétain, etc., car les solutions sont les mêmes, elles sont donc expliquées ici.

La raison pour laquelle le robot d'exploration Web apparaît comme un code tronqué

Le format d'encodage de la page Web source est incohérent avec le format d'encodage après l'exploration.
Si la page Web source est un flux d'octets codé par gbk, et après l'avoir récupéré, le programme utilise directement utf-8 pour l'encoder et l'envoyer dans le fichier de stockage, cela entraînera inévitablement un code tronqué lorsque la page Web source. est codé et capturé. Lorsque le programme utilise directement l'encodage de traitement pour être cohérent, il n'y aura pas de caractères tronqués à ce moment-là, si l'encodage des caractères est unifié, il n'y aura pas de caractères tronqués

Faites attention à la distinction

  • Code réseau source A,

  • code B utilisé directement par le programme,

  • code C pour une conversion unifiée des caractères.

Solution aux caractères tronqués

Déterminer le code A de la page Web source Le code A est souvent à trois positions dans la page Web<.>

1.Content-Type de l'en-tête http

Le site qui obtient l'en-tête du serveur peut l'utiliser pour informer le navigateur de certaines informations sur le contenu de la page. L'entrée Content-Type est écrite sous la forme "text/html; charset=utf-8".

2.meta charset



3. Définition du document dans l'en-tête de la page Web


<script type="text/javascript"> 
if(document.charset){ 
 alert(document.charset+"!!!!"); 
 document.charset = 'GBK'; 
 alert(document.charset); 
} 
else if(document.characterSet){ 
 alert(document.characterSet+"????"); 
 document.characterSet = 'GBK'; 
 alert(document.characterSet); 
}

Lors de l'obtention de l'encodage de la page Web source, jugez-le dans l'ordre Ces trois parties de données suffisent, d'avant en arrière, tout comme les priorités.

Il n'y a aucune information de codage dans les trois ci-dessus. Généralement, des outils d'identification intelligents de codage de pages Web tiers tels que chardet sont utilisés pour le faire

Installation : pip install chardet

Jugement de l'encodage des caractères Python chardet


L'utilisation de chardet peut facilement réaliser la détection de l'encodage des chaînes/fichiers Bien que les pages HTML aient des balises charset, elles sont parfois incorrectes. Alors Chardet peut nous aider beaucoup.

instance chardet

import urllib 
rawdata = urllib.urlopen('http://www.php.cn/').read() 
import chardet 
chardet.detect(rawdata) 
{'confidence': 0.99, 'encoding': 'GB2312'}

chardet peut directement utiliser la fonction de détection pour détecter l'encodage du caractère donné. La valeur de retour de la fonction est un dictionnaire avec deux éléments, l'un est la crédibilité de la détection et l'autre est l'encodage détecté.


Comment gérer l'encodage des caractères chinois dans le processus de développement de votre propre robot ?

Les éléments suivants sont tous destinés à python2.7. S'ils ne sont pas traités, les données collectées seront tronquées. est Traiter le HTML en un encodage utf-8 unifié et rencontrer l'encodage Windows-1252, qui appartient à la formation de reconnaissance de l'encodage chardet qui n'a pas été complétée

import chardet 
a='abc' 
type(a) 
str 
chardet.detect(a) 
{'confidence': 1.0, 'encoding': 'ascii'} 
 
 
a ="我" 
chardet.detect(a) 
{'confidence': 0.73, 'encoding': 'windows-1252'} 
a.decode('windows-1252') 
u'\xe6\u02c6\u2018' 
chardet.detect(a.decode('windows-1252').encode('utf-8')) 
type(a.decode('windows-1252')) 
unicode 
type(a.decode('windows-1252').encode('utf-8')) 
str 
chardet.detect(a.decode('windows-1252').encode('utf-8')) 
{'confidence': 0.87625, 'encoding': 'utf-8'} 
 
 
a ="我是中国人" 
type(a) 
str 
{'confidence': 0.9690625, 'encoding': 'utf-8'} 
chardet.detect(a) 
# -*- coding:utf-8 -*- 
import chardet 
import urllib2 
#抓取网页html 
html = urllib2.urlopen('http://www.jb51.net/').read() 
print html 
mychar=chardet.detect(html) 
print mychar 
bianma=mychar['encoding'] 
if bianma == 'utf-8' or bianma == 'UTF-8': 
 html=html.decode('utf-8','ignore').encode('utf-8') 
else: 
 html =html.decode('gb2312','ignore').encode('utf-8') 
print html 
print chardet.detect(html)

code python L'encodage du fichier

py est l'encodage ASCII par défaut. Lorsque le chinois est affiché, il sera converti de l'ASCII à l'encodage par défaut du système. À ce moment, une erreur se produira : SyntaxError : Non. -Caractère ASCII. Les instructions d'encodage doivent être ajoutées à la première ligne du fichier de code :

# -*- coding:utf-8 -*- 
 
print '中文'

La chaîne saisie directement comme ci-dessus est encodée selon le fichier de code 'utf-8' à gérer

Si le codage Unicode est utilisé, la méthode suivante est utilisée :

s1 = u'Chinese' #u signifie stocker des informations en codage Unicode


decode est une méthode dont toute chaîne dispose pour convertir la chaîne au format Unicode. Le paramètre indique le format d'encodage de la chaîne source.

encode est également une méthode dont dispose toute chaîne, convertissant la chaîne au format spécifié par le paramètre.

Ce qui précède représente l'intégralité du contenu de cet article. J'espère qu'il sera utile à l'apprentissage de chacun. J'espère également que tout le monde soutiendra le site Web PHP chinois.


Pour plus d'articles sur la façon de résoudre le problème des caractères tronqués dans les robots d'exploration Web Python, veuillez prêter 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