IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Python Discussion :

Parser un fichier XML contenant des accents


Sujet :

Python

  1. #1
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Points : 38
    Points
    38
    Par défaut Parser un fichier XML contenant des accents
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    try:
    	fileXML = open(fichierXML, 'r+')
    	fileXML = fileXML.read()
    	fileXML = u'%s'.encode(fichierEncodXML)%fileXML
    except IOError, message:
    	print >> sys.stderr, 'File could not be opened:', message
    	raw_input( '\nAppuyer sur une touche...' )
    	sys.exit( 1 )
     
    document = xml.dom.minidom.parseString(fileXML) #on parse le document
    Et voici le code d'erreur:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
     
    Traceback (most recent call last):
      File "profils.py", line 45, in <module>
        document = xml.dom.minidom.parseString(fileXML) #on parse le document
      File "C:\Python25\lib\xml\dom\minidom.py", line 1923, in parseString
        return expatbuilder.parseString(string)
      File "C:\Python25\lib\xml\dom\expatbuilder.py", line 940, in parseString
        return builder.parseString(string)
      File "C:\Python25\lib\xml\dom\expatbuilder.py", line 223, in parseString
        parser.Parse(string.decode('ISO-8859-1'), True)
    UnicodeEncodeError: 'ascii' codec can't encode characters in position 62-63: ord
    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!!

  2. #2
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 149
    Points : 219
    Points
    219
    Par défaut
    c'est l'inverse qu'il faut faire avec decode

    En tête de script, il faut mettre :
    ou autre encoding, on sait que le script va travailler en encoding utf

    et puis

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    fileXML = fileXML.read().decode('iso-8859-1')
    pour décoder un fichier en 'iso-8859-1'

    ou


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    line = fileXML.readline().decode('iso-8859-1')
    On peut alors traiter le fichier et pour l' enregistrer dans l'encodage que l'on veut, alors
    Après de nombreuses expériences avec les traitements de fichiers xml, je trouve qu'il est beaucoup plus facile de travailler avec ElementTree (module standard à partir de Python 2.5)

  3. #3
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Octobre 2008
    Messages
    42
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Octobre 2008
    Messages : 42
    Points : 38
    Points
    38
    Par défaut
    Comme mon script est en ISO, j'ai mis ça en tête de script:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    #-*- coding: ISO-8859-1 -*-
    En essayant avec
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    try:
    	fileXML = open(fichierXML, 'r+')
    	fileXML = fileXML.read().decode('iso-8859-1')
    	fileXML = u'%s'.encode('iso-8859-1')%fileXML
    except IOError, message:
    	print >> sys.stderr, 'File could not be opened:', message
    	raw_input( '\nAppuyer sur une touche...' )
    	sys.exit( 1 )
     
    document = xml.dom.minidom.parseString(fileXML) #on parse le document
    j'obtient toujours le même résultat. Si je retire la ligne ou j'encode en iso, ça ne change rien. J'ai voulu essayé d'utiliser ElementTree mais là j'ai:
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    xml.parsers.expat.ExpatError: syntax error: line 2, column 18
    Mais j'arrive pas à décoder le fichier (quand je fais file.encode ou file.decode, il me dit qu'il n'y a pas de tel attribut, je ne sais donc pas comment jouer sur l'encodage). Si tu as un truc pour utiliser ElementTree avec un fichier à accent, ça m'arrangerait tout aussi bien, je cherche juste à lire un fichier XML avec un parser assez rapide.

    EDIT: le problème est résolu, il suffit de passer par bautifulSoup:

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    from xml.etree.ElementTree import fromstring
    from BeautifulSoup import BeautifulStoneSoup as bs
    tree = fromstring(str(bs(open(fichierXML)))) #on charge le fichier XML avec ElementTree via BeautifulSoup
    Merci et bon codage !!

  4. #4
    Membre actif
    Profil pro
    Inscrit en
    Mars 2008
    Messages
    149
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2008
    Messages : 149
    Points : 219
    Points
    219
    Par défaut
    normalement, si ton fichier xml est encodé en "ISO-8859-1" et que ton script indique aussi cet encodage, alors il n'y a pas besoin d'utiliser decode ou encode

  5. #5
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Janvier 2011
    Messages
    146
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Janvier 2011
    Messages : 146
    Points : 32
    Points
    32
    Par défaut
    Bonjour,

    Je fais face à la même problématique, je cherche un peu d'aide pour comprendre pourquoi mon script ne marche pas. J'essai de parser un fichier xml qui contient bien en debut de ligne <?xml version="1.0" encoding="utf-8"?> avec le script suivant

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    path = "/home/..........."
    ....
    for files in xml_list:
    doc = minidom.parse(path + files)
    ....
    mais ca ne marche pas et me renvoi l'erreur

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    ExpatError('not well-formed (invalid token)...........................
    et ce que j'ai compris c'est parce que dans mon fichier xml il y a des accents et du coup ca plante mais je ne sais pas comment resoudre le probleme

    merci

Discussions similaires

  1. Fichier ANSI contenant des accents, convertir en UTF-8
    Par batou22003 dans le forum Entrée/Sortie
    Réponses: 4
    Dernier message: 03/01/2015, 12h51
  2. Réponses: 0
    Dernier message: 27/08/2012, 11h21
  3. Parser un fichier xml avec des tag names contenant ":" !
    Par sofien dans le forum Format d'échange (XML, JSON...)
    Réponses: 1
    Dernier message: 26/11/2010, 10h40
  4. [CXF et JAXB] Parser un fichier XML avec des namespaces
    Par cowa dans le forum Services Web
    Réponses: 0
    Dernier message: 26/02/2009, 14h30
  5. Compilation d'un fichier contenant des accents
    Par LG59 dans le forum Langage
    Réponses: 9
    Dernier message: 26/05/2006, 15h56

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo