【问题标题】:Python lxml custom parser isn't working with lxml.etree.parse(...) functionPython lxml 自定义解析器不适用于 lxml.etree.parse(...) 函数
【发布时间】:2015-12-05 01:58:41
【问题描述】:

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

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

【问题讨论】:

    标签: python python-3.x lxml


    【解决方案1】:

    这是因为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'>
    

    【讨论】:

      猜你喜欢
      • 2014-10-26
      • 1970-01-01
      • 1970-01-01
      • 2017-12-09
      • 1970-01-01
      • 2017-08-08
      • 2012-11-19
      • 2012-08-08
      • 2021-12-19
      相关资源
      最近更新 更多