12
votes

Comment analyser les chaînes Unicode avec minidom?

J'essaie d'analyser un tas de fichiers XML avec la bibliothèque xml.dom.minidom, pour extraire des données et la mettre dans un fichier texte. La plupart des XMLS vont bien, mais pour certains d'entre eux, j'obtiens l'erreur suivante lorsque vous appelez minidom.Parstring ():

UnicodeenCodeError: le codec 'ASCII' ne peut pas encoder le caractère U '\ U2019' en position 5189: ordinal non dans la plage (128)

Cela arrive aussi pour d'autres personnages non ASCII. Ma question est la suivante: quelles sont mes options ici? Suis-je censé bande / remplacer tous ces caractères non anglais avant de pouvoir analyser les fichiers XML?


0 commentaires

5 Réponses :


9
votes

Essayez de le décoder:

> print u'abcdé'.encode('utf-8')
> abcdé

> print u'abcdé'.encode('utf-8').decode('utf-8')
> abcdé


1 commentaires

Cela s'est avéré être à peu près ce dont j'avais besoin. J'ai utilisé Encode ('utf-8') lors de la lecture de la chaîne XML et a utilisé le module "codecs" pour ouvrir le fichier de sortie avec le codage UTF-8. Merci!



3
votes

minidom ne supporte pas directement l'analyse des chaînes UNICODE; C'est quelque chose qui a historiquement un soutien et une normalisation médiatisés. De nombreux outils XML ne reconnaissent que des flux d'octets comme quelque chose qu'un analyseur XML peut consommer.

Si vous avez des fichiers simples, vous devez les lire sous forme de chaînes d'octets (pas unicode!) et transmettez-le sur parsestring () ou simplement utiliser analyses () qui lira un fichier directement.


0 commentaires

-2
votes

Je rencontre cette erreur à quelques reprises, et mon mode de traitement hacrain de traiter est juste pour le faire:

def getCleanString(word):   
   str = ""
   for character in word:
      try: 
         str_character = str(character)
         str = str + str_character
      except:
         dummy = 1 # this happens if character is unicode
   return str


4 commentaires

Cela semble être un moyen très inefficace d'écrire Word.encode ('US-ASCII', 'Ignorer') .


L'exemple n'est même pas un code Python valide syntaxiquement


@mattbasta de quoi parles-tu? J'ai posté ceci en 2011. La syntaxe Python est probablement changée au cours de ces années.


@Henleychiu Il n'a pas été changé pour permettre aux commentaires de style C ++ (regarder la deuxième ligne de dernière ligne)



0
votes

Je connais le O.P. Demanda les cordes d'analyse, mais j'avais la même exception sur écrire em> le modèle DOM à un fichier via document.writeexml (...). Dans le cas où les gens avec ce problème (associé) posent de la terre ici, je vais offrir ma solution.

Mon code qui lançait l'UnicodeencodeError ressemblait à: P>

with tempfile.NamedTemporaryFile(delete=False) as fh:
    fh = codecs.lookup("utf-8")[3](fh)
    dom.writexml(fh, encoding="utf-8")


0 commentaires

5
votes

Si votre chaîne est 'str': xxx

cela a fonctionné pour moi.


0 commentaires