Parser HTML Python problème UTF-8

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjour, je ne suis absolument pas en train de faire du web mais bon c'est du python et du html ^^

Je suis en train de faire un parser pour extraire du texte d'un fichier html en utilisant la classe HTMLParser. Sauf que quand je lance j'obtient cette erreur :

1
UnicodeDecodeError: 'utf-8' codec can't decode byte 0xe9 

Que dois-je faire ? De ce que j'ai compris c'est un problème d'encodage mais je ne sais pas si c'est le fichier python ou le fichier html. Le texte est en français donc avec des accents et 'ç'

Merci d'avance :)

+0 -0

Vérifie quel est l'encodage de tes fichiers. Il existe pas mal de moyens de savoir quel est l'encodage d'un fichier, mais théoriquement la commande file devrait suffire (sinon tu peux essayer le module chardet de python).

+0 -0

Salut,

Je sais que tu as résolu ton problème, mais je pense que ça peux en aider d'autres (c'était moi il n'y a pas longtemps) :

1
2
with open('foo.txt', encoding='utf-8') as f:
    pass

La partie importante est l'argument encoding.

It goes against the grain of modern education to teach children to program. What fun is there in making plans, acquiring discipline in organizing thoughts, devoting attention to detail and learning to be self-critical? – Perlis

+0 -1

J'ai lu en diagonale, c'est de ma faute. Sorry.

It goes against the grain of modern education to teach children to program. What fun is there in making plans, acquiring discipline in organizing thoughts, devoting attention to detail and learning to be self-critical? – Perlis

+0 -0
Auteur du sujet

Bon, j'ai une nouvelle question D:

Grâce à Victor Hugo je découvre les joies d'encodage foireux. Comme hier je souhaite convertir un fichier en UTF-8 pour le lire en python après sauf que notre cher Hugo a eut la bonne idée de mettre des caractères spéciaux : œ

Bien entendu je n'arrive pas à convertir et j'ai beaucoup de mal à trouver comment faire (malgré une bonne 1/2 h de recherche en anglais). Voici le lien du fichier en question.

Encore merci d'avance ! :)

+0 -0
Auteur du sujet

Je veux pouvoir utiliser le fichier html pour ne récupérer que le texte. Quand je le fais avec python3, python me dit qu'il ne peut pas lire le fichier parce qu'il y a un caractère non UTF-8. Du coup je voudrais transformer mon fichier en UTF-8. Sauf qu'à cause de l'E dans l'O, ça ne fonctionne pas.

Je ne connais pas l'encodage du fichier

+0 -0

Du coup je voudrais transformer mon fichier en UTF-8. Sauf qu'à cause de l'E dans l'O, ça ne fonctionne pas.

Je ne connais pas l'encodage du fichier

Ces deux phrases sont contradictoires: tu ne peux pas convertir ton fichier en utf8 tant que tu ne connais pas l'encodage de départ.


Si tu ouvre ton fichier html, il y a cette ligne dans le head (les bons parsers html sont capables de l'exploiter tout seuls) :

1
<meta http-equiv=Content-Type content="text/html; charset=windows-1252">

J'ai aussi testé chardet, mais il se plante :

1
2
yoch@pc1:~/Bureau$ chardetect LES\ CONTEMPLATIONS.html 
LES CONTEMPLATIONS.html: ISO-8859-2 with confidence 0.783891786184
+0 -0
Auteur du sujet

Pour le parser j'utilise celui de python3 donc je suppose qu'il peut être catégorisé de "bon".

Pour les autres fichiers que j'ai récupéré de ce site, faire la conversion avec le ISO-8859 (il me semble) a parfaitement fonctionné.

Du coup si je comprend bien, il faut que j'utilise le format windows-1252 plutôt qu ele ISO ?

Je suis une quiche totale dans toutes ces choses et en plus c'est pas ma tasse de thé ^^.

+0 -0

Cette réponse a aidé l'auteur du sujet

Pour le parser j'utilise celui de python3 donc je suppose qu'il peut être catégorisé de "bon".

Non, il est simple et fait ce qu'on lui demande, mais pas spécialement évolué. Tu peux essayer lxml.html, voire Beautiful Soup.

Pour les autres fichiers que j'ai récupéré de ce site, faire la conversion avec le ISO-8859 (il me semble) a parfaitement fonctionné.

Connais pas, il y a différentes versions distinctes de ISO-8859.
Et puis, le fait qu'un encodage ne produise pas d'erreur ne prouve absolument pas que le décodage est correct.

Du coup si je comprend bien, il faut que j'utilise le format windows-1252 plutôt qu ele ISO ?

C'est selon si toutes les pages emploient le même encodage ou non. C'est aussi pour ça que la détection automatique est très pratique.


Un exemple d'utilisation avec lxml :

1
2
3
4
5
6
7
>>> import lxml.html
>>> doc = lxml.html.parse("http://www.ebooksgratuits.com/html/hugo_contemplations.html")
>>> doc.docinfo.encoding
'windows-1252'
>>> text = ''.join(doc.xpath('//text()'))
>>> 'œ' in text
True

Édité par yoch

+1 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte