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)
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)
编辑:根据评论,这个答案可能已经过时.但是当它被回答时,这确实起作用了......
这个代码片段对我有用。我在解析 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)
以上修复均不适合我。唯一有效的是使用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)
经过对整个 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)
| 归档时间: |
|
| 查看次数: |
87341 次 |
| 最近记录: |