ParseError: pas bien formé (invalid token) à l'aide de cElementTree
- Je recevoir des chaînes xml à partir d'une source externe qui contient unsanitized utilisateur contribué au contenu.
Le code xml suivant de la chaîne a donné un ParseError dans cElementTree
:
>>> print repr(s)
'<Comment>dddddddd\x08\x08\x08\x08\x08\x08_____</Comment>'
>>> import xml.etree.cElementTree as ET
>>> ET.XML(s)
Traceback (most recent call last):
File "<pyshell#4>", line 1, in <module>
ET.XML(s)
File "<string>", line 106, in XML
ParseError: not well-formed (invalid token): line 1, column 17
Est-il un moyen de faire cElementTree pas se plaindre?
OriginalL'auteur BioGeek | 2012-10-24
Vous devez vous connecter pour publier un commentaire.
Il semble se plaindre de
\x08
vous devrez échapper.Edit:
Ou vous pouvez avoir l'analyseur ignorer les erreurs à l'aide de
recover
cElementTree Element
.Vérifier mon montage...
l'échappement est pas la même que la modification de la tva.
le
recover
il n'est plus disponible pour ElementTreesXMLParser
, droit? Ou quoi "lxml'? Ce n'est pas vanille python?OriginalL'auteur iabdalkader
J'ai eu le même message d'erreur (avec ElementTree). Dans mon cas, c'était à cause de l'encodage et j'ai été en mesure de le résoudre sans avoir à utiliser une bibliothèque externe. Espérons que cela aide d'autres personnes à trouver cette question en se basant sur le titre. (référence)
MODIFIER: sur la Base des observations, cette réponse pourrait être dépassée. Mais ce n'travail en arrière quand il a été répondu...
fromstring
ne prend aucun argument en dehors de texte (il n'accepte pas l'analyseur). Peut-être que tu voulais direXML
au lieu defromstring
?parse
fonction aparser
attribut, donc vous pouvez lui donner un nom de fichier comme entrée à la place de la chaîne:e = ElementTree.parse(my_file, parser=ElementTree.XMLParser(encoding='iso-8859-5') )
Comme l'a mentionné le premier commentaire,
fromstring
n'accepte pas l'analyseur argument. Cette réponse est fausse dans la syntaxe.OriginalL'auteur juan
Voir cette réponse à une autre question, et la selon la partie du XML spécification.
L'arrière U+0008 est un caractère non valide dans des documents XML. Il doit être représenté comme évadé entité

et ne peut pas se produire simplement.Si vous avez besoin de traiter ce fragment de code XML, vous devez remplacer
\x08
danss
avant de l'introduire dans un analyseur XML.OriginalL'auteur Boldewyn
Une solution pour gottcha pour moi, à l'aide de Python ElementTree... c'est la non valide jeton d'erreur:
Cependant, il fonctionne avec l'ajout d'un trait d'union dans le type de codage:
Plus étrange. Quelqu'un trouvé cette note de bas de page dans le python docs:
OriginalL'auteur TimSC
J'ai été coincé avec un problème similaire. Enfin trouvé le quelle était la cause de racine dans mon cas particulier. Si vous lisez les données à partir de plusieurs fichiers XML qui se trouvent dans le même dossier vous permettra d'analyser aussi .DS_Store fichier.
Avant l'analyse d'ajouter cette condition
Cette astuce m'a aidé ainsi
OriginalL'auteur Yura Vasiliuk
Ce qui m'a aidé avec cette erreur a été de Juan réponse - https://stackoverflow.com/a/20204635/4433222
Mais n'est-ce pas assez, après avoir lutté, j'ai découvert qu'un fichier XML doit être enregistré en UTF-8 sans BOM encodage.
La solution n'est pas "normal" UTF-8.
oh, c'était il y a longtemps. ne me souviens pas en fait, mais probablement je viens d'enregistrer un fichier correctement dans notepad++
OriginalL'auteur Konrad
Il s'agit probablement d'une erreur de codage. J'ai eu par exemple un fichier xml encodé en UTF-8 BOM (vérifiée à partir de Notepad++ menu Encodage) et a obtenu message d'erreur similaire.
La solution de contournement (Python 3.6)
Vérifier l'encodage de votre fichier xml. Si c'est à l'aide d'un codage différent, changez le 'utf-8-sig" en conséquence.
OriginalL'auteur np8
Aucun de ces bugs ont travaillé pour moi. La seule chose qui a fonctionné a été d'utiliser
BeautifulSoup
au lieu deElementTree
comme suit:Alors vous pouvez chercher dans l'arborescence:
xml
analyseur deBeautifulSoup
'. Lorsque vous fournissez lexml
paramètreBeautifulSoup
, il utiliselxml
's XML parser sous le capot..merci, oui je voulais dire vous avez besoin pour installer
lxml
avant d'être en mesure d'utiliser BeautifulSoup de cette façon. Au moins dans mon cas, j'ai dû l'installer séparément...OriginalL'auteur tsando
J'ai essayé les autres solutions dans les réponses ici, mais pas eu de chance. Depuis que j'ai seulement nécessaire pour extraire de la valeur à partir d'un seul nœud xml j'ai donné et écrit ma fonction pour le faire:
Exemple d'utilisation serait:
OriginalL'auteur the_doc