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 Gilles G. . Évalué à 4.
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 lolop (site web personnel) . Évalué à 5.
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).
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
[^] # Re: Deux choses distinctes
Posté par BFG . Évalué à 3.
[^] # Re: Deux choses distinctes
Posté par lolop (site web personnel) . Évalué à 3.
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.
Votez les 30 juin et 7 juillet, en connaissance de cause. http://www.pointal.net/VotesDeputesRN
# L'erreur n'est pas très parlante...
Posté par pas_moi . Évalué à 3.
À 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.