pythonlxml自定义解析器无法使用lxml.etree.parse(…)功能

2024-09-22 16:41:01 发布

您现在位置:Python中文网/ 问答频道 /正文

在python3.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))

输出

^{pr2}$

我不知道是什么原因造成的,也不知道怎么解决。我可以解决这个问题,但是图书馆里的这样一个错误似乎很奇怪。在


Tags: 文件函数fromimportparser解析器parselookup
1条回答
网友
1楼 · 发布于 2024-09-22 16:41:01

这是因为parse()fromstring()返回不同的类型。引自The ^{} Tutorial > The ^{} function

"Note that parse() returns an ElementTree object, not an Element object as the string parser functions"

要获得等效类型,需要调用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))

输出:

^{pr2}$

相关问题 更多 >