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 httpLe 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".
<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); }
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
instance chardet
import urllib rawdata = urllib.urlopen('http://www.php.cn/').read() import chardet chardet.detect(rawdata) {'confidence': 0.99, 'encoding': 'GB2312'}
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 '中文'
Si le codage Unicode est utilisé, la méthode suivante est utilisée :
encode est également une méthode dont dispose toute chaîne, convertissant la chaîne au format spécifié par le paramètre.