utf8 codec ne peut pas décoder les octets 0x96 en python
Je suis en train de vérifier si un mot est sur une page pour de nombreux sites. Le script fonctionne très bien, pour dire les 15 sites et puis il s'arrête.
UnicodeDecodeError: 'utf8' codec ne peut pas décoder les octets 0x96 en position 15344: invalid octet de départ
J'ai fait une recherche sur stackoverflow et trouvé beaucoup de questions sur elle, mais je n'arrive pas à comprendre ce qui s'est passé dans mon cas.
J'aimerais le résoudre ou s'il y a une erreur d'ignorer ce site. Pls conseils comment je peux faire ce que je suis nouvelle et le code ci-dessous en lui-même m'a pris une journée pour écrire. Par la façon dont le site dont le script a été interrompu sur http://www.homestead.com
filetocheck = open("bloglistforcommenting","r")
resultfile = open("finalfile","w")
for countofsites in filetocheck.readlines():
sitename = countofsites.strip()
htmlfile = urllib.urlopen(sitename)
page = htmlfile.read().decode('utf8')
match = re.search("Enter your name", page)
if match:
print "match found : " + sitename
resultfile.write(sitename+"\n")
else:
print "sorry did not find the pattern " +sitename
print "Finished Operations"
Selon la Marque, les commentaires, j'ai changé le code pour mettre en œuvre beautifulsoup
htmlfile = urllib.urlopen("http://www.homestead.com")
page = BeautifulSoup((''.join(htmlfile)))
print page.prettify()
maintenant j'obtiens cette erreur
page = BeautifulSoup((''.join(htmlfile)))
TypeError: 'module' object is not callable
Je suis en train de leur démarrage rapide exemple de http://www.crummy.com/software/BeautifulSoup/documentation.html#Quick%20Start. Si je l'ai copier coller le code fonctionne très bien.
J'ai ENFIN réussi à le faire fonctionner. Merci à vous tous pour votre aide. Voici le code final.
import urllib
import re
from BeautifulSoup import BeautifulSoup
filetocheck = open("listfile","r")
resultfile = open("finalfile","w")
error ="for errors"
for countofsites in filetocheck.readlines():
sitename = countofsites.strip()
htmlfile = urllib.urlopen(sitename)
page = BeautifulSoup((''.join(htmlfile)))
pagetwo =str(page)
match = re.search("Enter YourName", pagetwo)
if match:
print "match found : " + sitename
resultfile.write(sitename+"\n")
else:
print "sorry did not find the pattern " +sitename
print "Finished Operations"
Vous devez vous connecter pour publier un commentaire.
De nombreuses pages web sont codées de manière incorrecte. Pour l'analyse HTML essayez BeautifulSoup comme il peut gérer de nombreux types de HTML incorrect que l'on trouve dans la nature.
C'est moi qui souligne.
L'octet à 15344 est 0x96. Sans doute à la position 15343 il est un simple codage octet d'un caractère, ou le dernier octet de plusieurs octets encodage, ce qui rend 15344 le début d'un personnage. 0x96 est en binaire 10010110, et n'importe quel octet correspondant au modèle 10XXXXXX (0x80 à 0xBF) ne peut être qu'une deuxième octet dans un encodage UTF-8.
D'où le flux n'est pas de l'UTF-8 ou autre est endommagé.
L'examen de l'URI d'un lien hypertexte, nous trouvons l'en-tête:
Puisqu'il n'existe pas de codage a déclaré, il convient d'utiliser la valeur par défaut pour le protocole HTTP, qui est l'ISO-8859-1 (alias "Latin 1").
L'examen du contenu, nous trouvons la ligne:
Qui est un mécanisme de secours pour les personnes qui sont, pour une raison quelconque, impossible de définir leurs en-têtes HTTP correctement. Cette fois, nous dit explicitement l'encodage des caractères ISO-8859-1.
En tant que tel, il n'y a aucune raison de s'attendre à la lecture comme de l'UTF-8 pour le travail.
Pour plus de plaisir, si l'on considère que dans la norme ISO-8859-1 0x96 code U+0096 qui est le caractère de contrôle "DÉBUT DE la ZONE protégée" nous constatons que ISO-8859-1 n'est pas correcte, soit. Il semble que les gens de la création de la page a fait l'erreur semblable à vous-même.
De contexte, il semblerait qu'ils l'ont effectivement utilisé Windows-1252, comme dans cet encodage 0x96 code U+2013 (TIRET demi-cadratin, ressemble
–
).Donc, pour analyser cette page particulière, vous souhaitez décoder en Windows-1252.
Plus généralement, vous souhaitez examiner les en-têtes lors de la cueillette des codages de caractères, et alors qu'il serait peut-être incorrecte dans ce cas (ou peut-être pas, plus que quelques "ISO-8859-1" codecs sont en fait Windows-1252), vous serez correct le plus souvent. Vous avez encore le besoin d'avoir quelque chose de rattraper les échecs de ce type en lecture avec une solution de repli. Le
decode
méthode prend un deuxième paramètre appeléerrors
. La valeur par défaut est'strict'
, mais vous pouvez aussi avoir'ignore'
,'replace'
,'xmlcharrefreplace'
(ne convient pas),'backslashreplace'
(ne convient pas) et vous pouvez enregistrer votre propre gestionnaire de secours aveccodecs.register_error()
.bs4.UnicodeDammit.detwingle()
Le site "http://www.homestead.com" n'a pas la prétention d'être vous envoyer de l'utf-8, la réponse prétend être iso-8859-1:
Vous devez utiliser l'encodage correct pour la page que vous avez effectivement reçu, et non simplement de deviner au hasard.
charset=ISO-8859-1
est le cyber-équivalent de "Le chèque est à la poste".