[Python]Parser un fichier XML contenant des accents

Parser un fichier XML contenant des accents [Python] - Python - Programmation

Marsh Posté le 12-10-2008 à 10:25:53    

Bonjour, je cherche à parser un fichier XML contenant des accents. J'éprouve des problèmes d'encodage et je trouve assez difficilement des informations sur le net. J'utilise pour le moment minidom pour parser un fichier encodé en ISO-8859-1. Voici mon code:
 

Code :
  1. try:
  2.    fileXML = open(fichierXML, 'r+')
  3.    fileXML = fileXML.read()
  4.    fileXML = u'%s'.encode('ISO-8859-1')%fileXML
  5. except IOError, message:
  6.    print >> sys.stderr, 'File could not be opened:', message
  7.    raw_input( '\nAppuyer sur une touche...' )
  8.    sys.exit( 1 )
  9. document = xml.dom.minidom.parseString(fileXML) #on parse le document


 
Et voici le code d'erreur:
 

Code :
  1. Traceback (most recent call last):
  2.   File "profils.py", line 45, in <module>
  3.     document = xml.dom.minidom.parseString(fileXML) #on parse le document
  4.   File "C:\Python25\lib\xml\dom\minidom.py", line 1923, in parseString
  5.     return expatbuilder.parseString(string)
  6.   File "C:\Python25\lib\xml\dom\expatbuilder.py", line 940, in parseString
  7.     return builder.parseString(string)
  8.   File "C:\Python25\lib\xml\dom\expatbuilder.py", line 223, in parseString
  9.     parser.Parse(string.decode('ISO-8859-1'), True)
  10. UnicodeEncodeError: 'ascii' codec can't encode characters in position 62-63: ord
  11. inal not in range(128)


 
J'ai déjà essayé pas mal de combinaisons avec les fonctions encode et decode mais rien ne fonctionne :s Quelqu'un pourrait-il m'aider svp?
 
Merci beaucoup!!

Message cité 1 fois
Message édité par Shadew le 12-10-2008 à 10:26:32
Reply

Marsh Posté le 12-10-2008 à 10:25:53   

Reply

Marsh Posté le 12-10-2008 à 14:45:29    

Shadew a écrit :

Bonjour, je cherche à parser un fichier XML contenant des accents. J'éprouve des problèmes d'encodage et je trouve assez difficilement des informations sur le net. J'utilise pour le moment minidom pour parser un fichier encodé en ISO-8859-1. Voici mon code:

 
Code :
  1. fileXML = u'%s'.encode('ISO-8859-1')%fileXML



C'est censé faire quoi cette merde?


Message édité par masklinn le 12-10-2008 à 14:45:37

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-10-2008 à 16:06:53    

Euh...C'est censé encoder la chaîne en ISO, pour que python puisse interpréter les symboles accentués (j'ai aussi essayé avec la fonction unicode mais ça fonctionne pas mieux)

Reply

Marsh Posté le 12-10-2008 à 16:15:21    

Shadew a écrit :

Euh...C'est censé encoder la chaîne en ISO


Ta chaîne est déjà encodée dans le fichier, c'est le principe de lire un fichier, c'est à ça que servent les encodages [:petrus75]

 

Donc là tu réencodes un truc encodé, bizarrement ya des chances que ça fasse des trucs pas voulus.

 

Ce dont tu as besoin ici, c'est de décoder ta chaîne pas de l'encoder, et accessoirement

Code :
  1. '%s'%fileXML


c'est complètement con, à remplacer par

Code :
  1. fileXML


[:petrus75]

 

De plus ton try/except n'a aucun intérêt, donc

Code :
  1. dom = xml.dom.minidom.parseString(
  2.    open(xmlFile, 'r+').read().decode('iso-8859-1'))


un truc du style.


Message édité par masklinn le 12-10-2008 à 16:16:06

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-10-2008 à 16:32:20    

J'ai essayé ainsi mais j'obtiens le même résultat. Je sais pas si ça peut influencer, mais en tête de fichier j'ai  

Code :
  1. #-*- coding: ISO-8859-1 -*-


 
J'avais dû le mettre car j'affiche des é et des à et si je le met pas, python me tire la figure en me disant qu'il sait pas comment c'est encodé.

Reply

Marsh Posté le 12-10-2008 à 16:34:47    

Shadew a écrit :

J'ai essayé ainsi mais j'obtiens le même résultat. Je sais pas si ça peut influencer, mais en tête de fichier j'ai  

Code :
  1. #-*- coding: ISO-8859-1 -*-


 
J'avais dû le mettre car j'affiche des é et des à et si je le met pas, python me tire la figure en me disant qu'il sait pas comment c'est encodé.


Ca n'a aucun rapport, ça c'est l'encodage de ton fichier python, le problème ici c'est l'encodage de ton fichier XML. T'es sûr que c'est de l'iso-8859-1?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-10-2008 à 16:49:26    

Oui, quand je l'ouvre avec IE sans mettre d'encodage ou en mettant utf-8 ça foire, et quand je met iso-8859-1, il s'ouvre correctement et les accents sont affichés correctement.
 
Si je fais
 

Code :
  1. print open(xmlFile, 'r+').read().decode('iso-8859-1')


 
il l'affiche sur la console sans problème.
 
Je sais pas si ça peut aider mais j'utilise python 2.5 (j'ai besoin de la bibli qui gère le mysql et qui n'est pas encore dispo pour les version >2.5)

Message cité 1 fois
Message édité par Shadew le 12-10-2008 à 17:00:47
Reply

Marsh Posté le 12-10-2008 à 17:30:31    

Shadew a écrit :

Oui, quand je l'ouvre avec IE sans mettre d'encodage ou en mettant utf-8 ça foire, et quand je met iso-8859-1, il s'ouvre correctement et les accents sont affichés correctement.
 
Si je fais
 

Code :
  1. print open(xmlFile, 'r+').read().decode('iso-8859-1')


 
il l'affiche sur la console sans problème.


T'as essayé d'utiliser parse plutôt que parseString? Et t'as absolument besoin de minidom ou tu peux regarder du côté d'ElementTree?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-10-2008 à 17:46:29    

masklinn a écrit :


T'as essayé d'utiliser parse plutôt que parseString? Et t'as absolument besoin de minidom ou tu peux regarder du côté d'ElementTree?

 

J'ai déjà essayé parse, et avec ça j'obtiens:

Code :
  1. xml.parsers.expat.ExpatError: syntax error: line 2, column 18


(line 2, column18 c'est quand il rencontre l'accent)

 

J'ai pas forcément besoin d'utiliser minidom mais avec ElementTree, j'obtiens  la même erreur que celle 3 lignes plus haut :s


Message édité par Shadew le 12-10-2008 à 17:46:57
Reply

Marsh Posté le 12-10-2008 à 17:48:46    

Ben no se alors, si tu peux fournir le fichier XML (directement, sans coller son contenu ici, j'ai besoin de l'original) je peux essayer de regarder, sinon pas vraiment.


Message édité par masklinn le 12-10-2008 à 17:48:56

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-10-2008 à 17:48:46   

Reply

Marsh Posté le 12-10-2008 à 18:19:12    

Je t'ai envoyé le fichier sur ton adresse hotmail. Merci de ton aide !!

Reply

Marsh Posté le 12-10-2008 à 19:22:34    

Bon, trouvé, en fait ElementTree.parse et ElementTree.fromstring prennent du texte encodé (et je présume que minidom est pareil) et refusent les documents unicode. Sauf que dans ET 1.2.6, effbot ne fournit pas de moyen de forcer un encoding, et tire celui-ci du document.

 

Or ton document n'indique aucun encoding dans son prologue (le machin <? xml ... ?> en haut du fichier), ce qui indique qu'il est encodé en utf-8 (ou en utf-16) d'après la spec XML (ton document est donc complètement illégal et malformé).

 

Tu as donc 3 possibilités:

 
  • La plus propre et la plus correcte, c'est que ton document soit en UTF-8 ou qu'il spécifie son encoding dans le prologue (cf note à la fin). Je conseillerais de choisir cette possibilité et de passer en utf-8, c'est de loin la méthode la plus propre (en fait c'est même la seule qui soit propre et correcte)
  • Télécharger et installer ElementTree 1.3 (qui n'a pas encore été releasé, c'est une alpha qui marche bien, mais une alpha quand même) chez qui on peut forcer l'encoding dans la fonction parse, cf note 2
  • BeautifulSoup tente de deviner les encodings des données qui lui sont fournis, il est donc possible de parser le fichier avec BeautifulStoneSoup (le module XML), puis de le sérialiser avec un encoding utf-8, et de balancer la sortie dans ElementTree.fromstring. C'est très dégueu, mais ça marche, cf note 3. Tu peux aussi utiliser directement BeautifulSoup, mais c'est pas une lib fantastique pour manipuler du XML correctement (elle est plutôt faite pour le scraping).


note 1: encoding dans le prologue

Code :
  1. <?xml version="1.0" encoding="iso-8859-1" ?>


note que ton encoding est peut-être du windows-1252 plutôt que du 8859-1

 

note 2: encoding & ET 1.3

Code :
  1. root = ET.parse("file.xml", parser=ET.XMLParser(encoding="iso-8859-1" ))
 

note 3: via BeautifulSoup

Code :
  1. >>> from BeautifulSoup import BeautifulStoneSoup as bs
  2. >>> from xml.etree.ElementTree import fromstring
  3. >>> tree = fromstring(str(bs(open("file.xml" ))))
  4. <Element membres at 2ae534>



Message édité par masklinn le 12-10-2008 à 19:23:37

---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 12-10-2008 à 20:44:00    

Kikoo, c'est nickel, j'ai réussi à ouvrir mon fichier grâce à toi!!! Merci beaucoup!!!!
 
Bonne soirée!!
 
 :D  :D  :D  :D


Message édité par Shadew le 12-10-2008 à 20:44:20
Reply

Marsh Posté le 12-10-2008 à 22:44:55    

Avec quelle méthode?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
Reply

Marsh Posté le 13-10-2008 à 09:57:29    

En réalité, j'ai commencé avec la 1 mais ça fonctionnait pas avec ma version de ET, j'ai donc voulu télécharger la dernière version de ET (1.3), mais il fallait commencer à utiliser svn co, etc pour l'installer. Et comme je souhaite que cela reste assez simple à installer pour n'importe quel quidam, je me suis rabattu sur la 3. BS ne demande qu'un rajout d'un fichier dans le dossier contenant Python.


Message édité par Shadew le 13-10-2008 à 09:58:27
Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed