改善node.xpath('//')

问题描述 投票:1回答:1

我发现自己正在执行以下操作,以查找可能出现在多个xpath上的一个节点,但是该节点本身只会出现一次:

node.xpath('//Parent')

这将搜索all路径以找到Parent元素。但是,它只出现一次(尽管它可能出现在大约10条可能的路径上,并且写出来很繁琐)。有没有一种我可以使用的方法,当返回第一个元素而不是构建该路径上所有节点的列表时,可以更有效地查找并退出该方法?

python xpath lxml
1个回答
2
投票

如果我的理解正确,则不必使用XPath,并且可以通过其名称来标识有问题的元素。然后,您可以使用event-driven parsing-也称为“ SAX”解析-代替lxml默认情况下执行的常规“ DOM”解析。

代码类似于(伪代码)

some_file_like = BytesIO(b"<root><a>data</a></root>")
for event, element in etree.iterparse(some_file_like):
    if element.tag == "Parent":
        act_on(element)
        break

或者,非常相似的方法是在Python中使用SAX解析器实现,例如https://docs.python.org/3/library/xml.sax.reader.html。这将为您提供对解析的更细粒度的控制,因为您将编写在遇到某种事件类型时执行的自定义回调。

一个例子,改编自here

from xml.sax import saxutils, handler, make_parser

class ContentGenerator(handler.ContentHandler):

    def __init__(self, out = sys.stdout):
        handler.ContentHandler.__init__(self)

    def startDocument(self):
        pass

    def startElement(self, name, attrs):
        if name == "Parent":
            # act on this element
© www.soinside.com 2019 - 2024. All rights reserved.