gpt4 book ai didi

Python lxml 自定义解析器不适用于 lxml.etree.parse(...) 函数

转载 作者:太空宇宙 更新时间:2023-11-04 10:18:10 27 4
gpt4 key购买 nike

在 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'>

我不知道是什么原因造成的,也不知道如何解决。我可以解决它,但库中的这样一个错误似乎很奇怪。

最佳答案

那是因为 parse()fromstring() 返回的类型不同。引自 The lxml.etree Tutorial > The parse() 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))

输出:

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

关于Python lxml 自定义解析器不适用于 lxml.etree.parse(...) 函数,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34100397/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com