ParseError:使用cElementTree格式不正确(无效令牌)

Bio*_*eek 20 python parsing elementtree

我从外部源接收xml字符串,其中包含未经授权的用户贡献内容.

以下xml字符串给出了ParseError 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
Run Code Online (Sandbox Code Playgroud)

有没有办法让cElementTree不抱怨?

iab*_*der 26

似乎抱怨\x08你需要逃避这一点.

编辑:

或者你可以让解析器忽略错误 recover

from lxml import etree
parser = etree.XMLParser(recover=True)
etree.fromstring(xmlstring, parser=parser)
Run Code Online (Sandbox Code Playgroud)

  • `recover`它不再适用于ElementTrees`XMLParser`,对吧?还是什么'lxml'?这不是香草蟒蛇? (5认同)

jua*_*uan 23

我遇到了同样的错误(使用ElementTree).在我的情况下,这是因为编码,我能够解决它而无需使用外部库.希望这有助于其他人根据标题找到这个问题.(参考)

import xml.etree.ElementTree as ET
parser = ET.XMLParser(encoding="utf-8")
tree = ET.fromstring(xmlstring, parser=parser)
Run Code Online (Sandbox Code Playgroud)

编辑:根据评论,这个答案可能已经过时.但是当它被回答时,这确实起作用了......

  • `parse`函数有`parser`属性,因此你可以给它一个文件名作为输入而不是字符串:`e = ElementTree.parse(my_file,parser = ElementTree.XMLParser(encoding ='iso-8859-5')) ` (4认同)
  • 我不相信这是正确的,[`fromstring`除了文本之外不接受任何参数(它不接受解析器)](https://docs.python.org/2/library/xml.etree.elementtree的.html#xml.etree.ElementTree.fromstring).也许你的意思是[`XML`而不是`fromstring`](https://docs.python.org/2/library/xml.etree.elementtree.html#xml.etree.ElementTree.XML)? (3认同)

Kri*_*uni 9

这个代码片段对我有用。我在解析 XML 文件批次时遇到问题。我必须将它们编码为“iso-8859-5”

import xml.etree.ElementTree as ET

tree = ET.parse(filename, parser = ET.XMLParser(encoding = 'iso-8859-5'))
Run Code Online (Sandbox Code Playgroud)


tsa*_*ndo 7

以上修复均不适合我。唯一有效的是使用BeautifulSoup而不是ElementTree如下:

from bs4 import BeautifulSoup

with open("data/myfile.xml") as fp:
    soup = BeautifulSoup(fp, 'xml')
Run Code Online (Sandbox Code Playgroud)

然后你可以搜索树:

soup.find_all('mytag')
Run Code Online (Sandbox Code Playgroud)


Bol*_*wyn 6

请参阅另一个问题的答案和XML规范的相应部分.

退格U + 0008是XML文档中的无效字符.它必须表示为转义实体&#8;,并且不能明确地发生.

如果您需要处理这个XML片段,必须更换\x08s馈入一个XML解析器之前.


Haz*_*iee 5

经过对整个 WWW 的大量搜索后,我才发现如果您希望 XML 解析器正常工作,则必须转义某些字符!以下是我的做法和为我工作的方式:

escape_illegal_xml_characters = lambda x: re.sub(u'[\x00-\x08\x0b\x0c\x0e-\x1F\uD800-\uDFFF\uFFFE\uFFFF]', '', x)
Run Code Online (Sandbox Code Playgroud)

并像平常一样使用它:

ET.XML(escape_illegal_xml_characters(my_xml_string)) #instead of ET.XML(my_xml_string)
Run Code Online (Sandbox Code Playgroud)