10
votes

Python: Unicode et Elementtree.Parse

J'essaie de déménager à Python 2.7 et puisque Unicode est un gros problème là-bas, j'essaierais de traiter avec eux avec des fichiers et des textes XML et d'analyser à l'aide du xml.etree.celementtree code> une bibliothèque. Mais j'ai couru sur cette erreur: xxx pré>

La même chose se produit à l'aide de io.open ('fichier.xml', encoding = 'utf-8') code> pour passer à ET.PARSE CODE>: P>

>>> with io.open('test.xml', mode='rb') as fp:
...     ET.parse(fp)
...
<ElementTree object at 0x0180BC10>


0 commentaires

3 Réponses :


4
votes

ne peut pas utiliser xxx

dans votre premier exemple?


3 commentaires

Je n'ai pas réalisé que cette fonction existait. Point mineur Toutefois: Dutring renvoie un élément , tandis que parse renvoie un Elementtree .


Cette fonction est également appelée alias, xml , i.e. de xml.etree.celementtree importe xml . Cet alias est là pour qu'il soit bien lu si vous avez une constante XML dans votre code; Vous pouvez simplement faire FooDocument = XML ("" "..." "") .


Le module xml.etree.celementtre est obsolète depuis Python 3.3. Voir docs.python.org/3/Library/xml.etree.ElementTree .html



7
votes

J'ai rencontré le même problème que vous dans Python 2.6.

Il semble que "UTF-8" codant pour Celementtree.Parse dans la version Python 2.x et 3.x est différente. Dans Python 2.x, nous pouvons utiliser XMLParser pour encoder l'Unicode. Par exemple: xxx

Vous pouvez vous reporter à cette page pour la méthode xmlParser (section "xmlParser"): http://effbot.org/zone/elementtree-13-intro.htm

tandis que la méthode suivante fonctionne pour la version Python 3.x: < / p> xxx

espère que cela peut vous aider.


1 commentaires

C'est une sorte de droite, mais les versions de l'élévateur sont plus similaires entre Python 2 et Python 3 que vous leur donnez crédit. Je vais écrire une réponse différente, je pense.



15
votes

Votre problème est que vous nourrissez ellementtree unicode, mais il préfère pour consommer des octets. Il sera fournir vous avec Unicode dans tous les cas.

dans Python 2.x, il peut seulement consommer d'octets. Vous pouvez le dire ce qui codant pour ces octets, mais c'est tout. Donc, si vous devez littéralement travailler avec un objet qui représente un fichier texte , comme io.stringio , vous devrez d'abord le convertir en autre chose.

Si vous commencez littéralement avec un 2.x- STR (AKA octets ) dans l'encodage UTF-8, en mémoire, comme dans votre exemple, utilisez xml.etree.celementtree.xml pour l'analyser dans XML dans un swoop tombé et ne vous inquiétez de rien: -).

Si vous souhaitez une interface pouvant traiter des données incrémentalement lues à partir d'un fichier, utilisez xml.etree.celementtree.parse avec un io.bytesio Pour le convertir en un flux d'octets en mémoire plutôt qu'une chaîne de caractères en mémoire. Si vous souhaitez utiliser io.open , utilisez-le avec le drapeau B , de sorte que vous obtenez des flux d'octets.

in Python 3.x, vous peut passer unicode directement dans à Elementtree, qui est un peu plus pratique et sans doute la version plus récente de WeleTree est plus correcte pour permettre cela. Cependant, vous risquez toujours de ne pas vouloir, et la version de Python 3 accepte toujours les octets comme entrée. Vous commencez toujours par les octets de toute façon: en les transmettant directement de votre source d'entrée à Elementtree, vous devez le laisser faire de son codage ou de décoder intelligemment à l'intérieur du moteur analysé XML, ainsi que de la détection à la volée des déclarations de codage Dans le flux d'entrée, que vous pouvez faire avec XML, mais que vous ne pouvez pas faire de données textuelles arbitraires. Donc, laissant l'analyseur XML faire le travail du décodage est le bon endroit pour mettre cette responsabilité.


0 commentaires