Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1087 connectés 

  FORUM HardWare.fr
  Programmation
  Python

  [Python]Parser un fichier XML contenant des accents

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[Python]Parser un fichier XML contenant des accents

n°1798755
Shadew
Posté le 12-10-2008 à 10:25:53  profilanswer
 

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
mood
Publicité
Posté le 12-10-2008 à 10:25:53  profilanswer
 

n°1798834
masklinn
í dag viðrar vel til loftárása
Posté le 12-10-2008 à 14:45:29  profilanswer
 

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
n°1798858
Shadew
Posté le 12-10-2008 à 16:06:53  profilanswer
 

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)

n°1798860
masklinn
í dag viðrar vel til loftárása
Posté le 12-10-2008 à 16:15:21  profilanswer
 

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
n°1798870
Shadew
Posté le 12-10-2008 à 16:32:20  profilanswer
 

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é.

n°1798871
masklinn
í dag viðrar vel til loftárása
Posté le 12-10-2008 à 16:34:47  profilanswer
 

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
n°1798873
Shadew
Posté le 12-10-2008 à 16:49:26  profilanswer
 

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
n°1798879
masklinn
í dag viðrar vel til loftárása
Posté le 12-10-2008 à 17:30:31  profilanswer
 

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
n°1798882
Shadew
Posté le 12-10-2008 à 17:46:29  profilanswer
 

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
n°1798883
masklinn
í dag viðrar vel til loftárása
Posté le 12-10-2008 à 17:48:46  profilanswer
 

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
mood
Publicité
Posté le 12-10-2008 à 17:48:46  profilanswer
 

n°1798895
Shadew
Posté le 12-10-2008 à 18:19:12  profilanswer
 

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

n°1798912
masklinn
í dag viðrar vel til loftárása
Posté le 12-10-2008 à 19:22:34  profilanswer
 

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
n°1798947
Shadew
Posté le 12-10-2008 à 20:44:00  profilanswer
 

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
n°1799012
masklinn
í dag viðrar vel til loftárása
Posté le 12-10-2008 à 22:44:55  profilanswer
 

Avec quelle méthode?


---------------
Stick a parrot in a Call of Duty lobby, and you're gonna get a racist parrot. — Cody
n°1799115
Shadew
Posté le 13-10-2008 à 09:57:29  profilanswer
 

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

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  Python

  [Python]Parser un fichier XML contenant des accents

 

Sujets relatifs
vbscript - probleme de copie de fichiercreation de fichier dans les sous repertoires
[VBA] Ouvrir un fichier Excel qui commence par...copier un fichier dans une variable
Edition de fichier texte.Création d'un fichier installateur
Open XML API : insérer une image dans WordComptabiliser le nombre de fois que se répète un mot dans un fichier
lire des donnees dans un fichier texteparser du texte ?
Plus de sujets relatifs à : [Python]Parser un fichier XML contenant des accents


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR