ParseError: niet goed gevormd (ongeldige token) met behulp van cElementTree
Ik ontvangen xml-snaren van een externe bron die kan bevat unsanitized gebruikers bijgedragen inhoud.
De volgende xml-string gaf een ParseError in 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
Is er een manier om cElementTree niet klagen?
Het lijkt te klagen over
\x08
je nodig hebt om te ontsnappen dat.Edit:
Of u kunt de parser negeren van de fouten met behulp van de
recover
cElementTree Element
.recover
het niet langer beschikbaar voor ElementTreesXMLParser
, toch? Of wat ‘lxml’? Het is niet de vanille python?Ik had dezelfde fout (met ElementTree). In mijn geval was het omdat van coderingen, en ik was in staat om het op te lossen zonder gebruik te maken van een externe bibliotheek. Hoop dat dit helpt andere mensen vinden van deze vraag op basis van de titel. (verwijzing)
BEWERKEN: op Basis van opmerkingen, dit antwoord kunnen verouderd zijn. Maar dit werkte terug toen het werd beantwoord…
fromstring
neemt geen argumenten naast tekst (het niet accepteren parser). Misschien dat het de bedoeling isXML
in plaats vanfromstring
?parse
functie heeftparser
attribuut, zo kun je het bestand als input in plaats van string:e = ElementTree.parse(my_file, parser=ElementTree.XMLParser(encoding='iso-8859-5') )
fromstring
niet accepteren van de parser argument. Dit antwoord is fout in syntax.Zie dit antwoord naar een andere vraag en de volgens onderdeel van de XML-specificatie.
De backspace – U+0008 is een ongeldig teken in XML-documenten. Het moet voorgesteld worden als een ontsnapte entiteit

en kan niet optreden duidelijk.Als u nodig hebt om het verwerken van de XML-fragment, moet u deze vervangen
\x08
ins
voor het voeren in een XML-parser.Een oplossing voor gottcha voor mij, met behulp van Python ‘ s ElementTree… dit is het ongeldige token fout:
Echter, het werkt met de toevoeging van een koppelteken in de type codering:
Meest oneven. Iemand vond deze voetnoot in de python-docs:
Ik heb in zitten met hetzelfde probleem. Eindelijk bedacht wat was de oorzaak van mijn zaak. Als je de gegevens van meerdere XML-bestanden die zich in dezelfde map die u parseren ook .DS_Store bestand.
Voor het parseren toevoegen aan deze voorwaarde
Deze truc hielp me
Dit is waarschijnlijk een codering fout. Bijvoorbeeld ik had een xml-bestand gecodeerd in UTF-8-BOM (gecontroleerd aan de hand van de Notepad++ Codering menu) en kreeg een vergelijkbaar foutbericht weergegeven.
De oplossing (Python 3.6)
Controleer de codering van uw xml-bestand. Als het gebruik van andere codering, het wijzigen van de ‘utf-8-sig’ dienovereenkomstig.
Geen van de bovenstaande oplossingen gewerkt voor mij. Het enige dat werkte was gebruik te maken van
BeautifulSoup
in plaats vanElementTree
als volgt:Dan kunt u zoeken op de boom als:
xml
parser vanBeautifulSoup
‘. Wanneer u dexml
parameterBeautifulSoup
, het maakt gebruik vanlxml
’s XML-parser onder de motorkap..lxml
voordat u gebruik kunt maken BeautifulSoup deze manier. Tenminste in mijn geval had ik te installeren, apart…Wat mij geholpen met die fout was Juan ‘ s antwoord – https://stackoverflow.com/a/20204635/4433222
Maar nog niet genoeg was – na het worstelen ben ik erachter gekomen dat een XML-bestand moet worden opgeslagen met UTF-8 (zonder BOM) – codering.
De oplossing niet werken voor “normale” UTF-8.
Het enige dat werkte voor mij is dat ik moest add mode en codering bij het openen van het bestand zoals hieronder:
Anders is niet elke keer met een ongeldige token fout als ik gewoon dit doen:
Ik probeerde de andere oplossingen in de antwoorden hier, maar had geen geluk. Omdat ik alleen nodig voor het uitpakken van de waarde van een enkel xml-knooppunt ik gaf in en schreef mijn functie om dit te doen:
Voorbeeld gebruik zou worden: