Forum Programmation.python Python, XML et encodage de caractères

Posté par  .
Étiquettes :
0
31
jan.
2011
Bonjour à tous.

Depuis quelques jours, je m'efforce de coder un script python capable d'interpréter les différentes données 'XML' provenant de la base de données médicale "Pubmed" ( http://www.ncbi.nlm.nih.gov/pubmed ).

L'un des outils de la NCBI (National Center for Biotechnology Information), via l'un de leur outils en PERL ( http://eutils.ncbi.nlm.nih.gov/eutils_example.pl ), permet de récupérer un fichier XML contenant les différentes informations relatives à un article.

Voici l'entête des fichiers XML récupérés avec le script en PERL (le .dtd n'est pas plus exhaustif):
<?xml version="1.0"?>
<!DOCTYPE PubmedArticleSet PUBLIC "-//NLM//DTD PubMedArticle, 1st January 2011//EN" "http://www.ncbi.nlm.nih.gov/entrez/query/DTD/pubmed_110101.d(...)
<PubmedArticleSet>

J'utilise actuellement une Debian Squeeze (python v2.6.6)
et l'entête de mon script comporte # -*- coding: utf-8 -*-
Etant donné l'utilisation prévisiblement basique de l'API XML, mon choix s'est porté sur minidom.

La commande "locale" ne rapporte que l'utilisation de : fr_FR.UTF-8

Voici la portion de code qui me pose problème :
203 fsock = open('myfile.xml')
204 xmlEutils = minidom.parse(fsock)
205 fsock.close()

Et voici l'erreur générée :
Traceback (most recent call last):
File "./test.py", line 204, in
xmlEutils = minidom.parse(fsock)
File "/usr/lib/python2.6/xml/dom/minidom.py", line 1918, in parse
return expatbuilder.parse(file)
File "/usr/lib/python2.6/xml/dom/expatbuilder.py", line 928, in parse
result = builder.parseFile(file)
File "/usr/lib/python2.6/xml/dom/expatbuilder.py", line 207, in parseFile
parser.Parse(buffer, 0)
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 35, column 78

La ligne 35 est la suivante (à l'indentation près) :
"Intensive Care Unit, University Hospital Ambroise Paré, Faculté de Médecine Paris Ile de France Ouest, Université de Versailles Saint Quentin en Yvelines, Boulogne, France."
La colonne 78 représente le "r" de "Paré", soit juste avant un caractère accentué.

J'obtiens une erreur identique avec un fichier différent :
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 39, column 33
La ligne 39, toujours à l'indentation près est la suivante :
"Jesús"
Sur la colonne 33 se situe le premier 's' de "Jesús"

Le traitement d'articles dénués de caractères accentués ou "exotiques" s'effectue sans problème.

S'agissant d'un problème vraisemblablement lié à l'encodage de caractères, j'ai consulté d'innombrables pages relatives à ce sujet, .... sans aucun succès.
Aussi, je remercie par avance la personne qui pourra m'aider à résoudre ce problème.
  • # Unicode

    Posté par  . Évalué à 4.

    As-tu essayé ça?
    xmlUnicode = unicode( contenuDuFichier, "utf-8" )
    minidom.parse(xmlUnicode)


    Parce que dans mes souvenirs, c'est comme ça que ça fonctionne.
  • # Deux choses distinctes

    Posté par  (site web personnel) . Évalué à 5.

    et l'entête de mon script comporte # -*- coding: utf-8 -*-

    Cela impacte l'interprétation des chaînes unicode dans le source de ton script.

    Pour les données que tu lis par ailleurs, il faut soit convertir explicitement une str vers unicode, en indiquant l'encodage du str - comme l'indique Gilles G, soit passer par le wrapper d'ouverture de fichiers codecs.open(nom,mode,encoding="utf-8") qui retourne un objet file-like pour lequel la lecture produit de chaînes unicode (note qu'en Python3 la fonction open fournit directement ce wrapper).

    Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

    • [^] # Re: Deux choses distinctes

      Posté par  . Évalué à 3.

      Pas uniquement les chaines, mais bien tout le code source : https://linuxfr.org/~Guillaum/30374.html (quelqu'un qui s'est amusé à définir un "encodage BrainF*ck")
      • [^] # Re: Deux choses distinctes

        Posté par  (site web personnel) . Évalué à 3.

        Ok, mais c'est quand même une utilisation un peu... spéciale :-)

        Par contre, tu as raison de le préciser car, comme avec Python3 on peut mettre des accents dans les identificateurs, ça devient important pour le reste du source en plus des chaînes.

        Python 3 - Apprendre à programmer dans l'écosystème Python → https://www.dunod.com/EAN/9782100809141

  • # L'erreur n'est pas très parlante...

    Posté par  . Évalué à 3.

    mais je te conseille la lecture de la documentation unicode de Python et plus particulièrement de la partie expliquant comment spécifier l'encodage d'un fichier à sa lecture afin d'obtenir des données directement exploitables : http://docs.python.org/howto/unicode.html#reading-and-writin(...)

    À mon avis, un

    import codecs
    fsock = codecs.open('myfile.xml', encoding='utf-8')
    ...

    devrait mieux se comporter.

Suivre le flux des commentaires

Note : les commentaires appartiennent à celles et ceux qui les ont postés. Nous n’en sommes pas responsables.