Python lxml自定义解析器不能与lxml.etree.parse(...)函数

时间:2015-12-05 01:58:42

标签: python python-3.x lxml

在python 3.5项目中,我必须阅读一些xml文件,然后决定使用lxml库。由于我在文件中读取,根据文档执行此操作的最有效方法是使用lxml.etree.parse(...)函数进行读取。

我遇到的问题是这个函数似乎总是使用默认解析器,即使我传递了自定义解析器。 lxml.etree.fromstring(...)函数可以正常工作。

此代码显示了我遇到的问题。如果我给它一个文件路径,parse()给出相同的输出。

from io import StringIO
from lxml import etree

class honk(etree.ElementBase):
    pass

parser_lookup = etree.ElementDefaultClassLookup(element=honk)
parser = etree.XMLParser()
parser.set_element_class_lookup(parser_lookup)

elem1 = etree.parse(StringIO("<test/>"), parser)
elem2 = etree.fromstring("<test/>", parser)

print(isinstance(elem1, honk), type(elem1))
print(isinstance(elem2, honk), type(elem2))

输出

False <class 'lxml.etree._ElementTree'>
True <class '__main__.honk'>

我不知道是什么导致它或如何解决它。我可以解决它,但库中的这个错误似乎很奇怪。

1 个答案:

答案 0 :(得分:4)

那是因为parse()fromstring()会返回不同的类型。引自The lxml.etree Tutorial > The parse() function

  

“请注意parse()返回ElementTree对象,而不是Element对象,因为字符串解析器函数”

要获得等效类型,您需要致电getroot()

.....
tree = etree.parse(StringIO("<test/>"), parser)
elem1 = tree.getroot()
elem2 = etree.fromstring("<test/>", parser)

print(isinstance(elem1, honk), type(elem1))
print(isinstance(elem2, honk), type(elem2))

输出

True <class '__main__.honk'>
True <class '__main__.honk'>