Python+;Expat:on&;上的错误#0; 实体
我编写了一个小函数,它使用ElementTree和xpath提取xml文件中某些元素的文本内容:Python+;Expat:on&;上的错误#0; 实体,python,xml,parsing,elementtree,expat-parser,Python,Xml,Parsing,Elementtree,Expat Parser,我编写了一个小函数,它使用ElementTree和xpath提取xml文件中某些元素的文本内容: #!/usr/bin/env python2.5 import doctest from xml.etree import ElementTree from StringIO import StringIO def parse_xml_etree(sin, xpath): """ Takes as input a stream containing XML and an XPath expr
#!/usr/bin/env python2.5
import doctest
from xml.etree import ElementTree
from StringIO import StringIO
def parse_xml_etree(sin, xpath):
"""
Takes as input a stream containing XML and an XPath expression.
Applies the XPath expression to the XML and returns a generator
yielding the text contents of each element returned.
>>> parse_xml_etree(
... StringIO('<test><elem1>one</elem1><elem2>two</elem2></test>'),
... '//elem1').next()
'one'
>>> parse_xml_etree(
... StringIO('<test><elem1>one</elem1><elem2>two</elem2></test>'),
... '//elem2').next()
'two'
>>> parse_xml_etree(
... StringIO('<test><null>�</null><elem3>three</elem3></test>'),
... '//elem2').next()
'three'
"""
tree = ElementTree.parse(sin)
for element in tree.findall(xpath):
yield element.text
if __name__ == '__main__':
doctest.testmod(verbose=True)
。。。屈服
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 12
但在我的特殊情况下,我并不需要XPath解析,我可以使用BeautifulSoup本身及其解析的树.test.elem1.contents[0]&0代码>不在XML规范定义的范围内。唉,我的Python技能相当初级,因此我在这方面没有多少帮助。&0代码>不是有效的XML字符。理想情况下,您可以让文件的创建者更改其流程,这样文件就不会像这样无效
如果必须接受这些文件,您可以对它们进行预处理,将
转换为其他文件。例如,选择@作为转义字符,将“@”变为“@@”,将“;
”变为“@0”
然后,当您从解析器获得文本数据时,您可以反转映射。这只是一个例子,你可以发明任何你喜欢的转义语法。Hm,是的,规范非常清楚。谢谢你的准确参考。我知道这是一个旧的线程,但规范中说什么文字字符可能只出现在XML中。字节序列;不是一个空字符,而是一个表示空字节的4字符序列。鉴于这种区别,它是;合法的我在规范中找不到任何说明这是非法的。这是一个有效的问题。但答案是这样的:“使用字符引用引用的字符必须与字符的生成相匹配。”在我的特殊情况下,我可以删除它们。它们位于XML的一个无关元素中。虽然使用文本处理来处理XML感觉不太可靠,但由于它的格式不好,我想我别无选择。。。使用某种标记汤解析器似乎有些过分。您确定转义算法是健壮的吗?难道你不需要考虑XML语法中的特征的优先级吗?
xml.parsers.expat.ExpatError: not well-formed (invalid token): line 1, column 12