【问题标题】:How to get all sub-elements of an element tree with Python ElementTree?如何使用 Python ElementTree 获取元素树的所有子元素?
【发布时间】:2012-05-11 15:25:36
【问题描述】:

我想找到一种方法来获取元素树的所有子元素,就像 ElementTree.getchildren() 所做的那样,因为自 Python 2.7 版以来不推荐使用 getchildren()
我不想再用了,虽然我现在还能用。

【问题讨论】:

    标签: python xml elementtree


    【解决方案1】:

    elem 的所有子元素(后代):

    all_descendants = list(elem.iter())
    

    一个更完整的例子:

    >>> import xml.etree.ElementTree as ET
    >>> a = ET.Element('a')
    >>> b = ET.SubElement(a, 'b')
    >>> c = ET.SubElement(a, 'c')
    >>> d = ET.SubElement(a, 'd')
    >>> e = ET.SubElement(b, 'e')
    >>> f = ET.SubElement(d, 'f')
    >>> g = ET.SubElement(d, 'g')
    >>> [elem.tag for elem in a.iter()]
    ['a', 'b', 'e', 'c', 'd', 'f', 'g']
    

    排除根本身:

    >>> [elem.tag for elem in a.iter() if elem is not a]
    ['b', 'e', 'c', 'd', 'f', 'g']
    

    【讨论】:

    • 对不起Eli,但也许我没有让自己理解,我只是想获取所有子元素,而不是根。即这里不需要根。但我认为你的方法也包含根对象,对吧?
    • 但是如果在元素“a”中嵌套了多个带有标签“a”的结构,并且我想获取所有“a”结构的所有子元素,该怎么办?
    • 元素对象也是可迭代的,无需使用iter()。该元素的行为也像一个列表;所以,你也可以索引子元素。
    • @pepr:是的,但这只会给你元素的直接子元素,而不是所有的后代
    • @Eli Bendersky:我明白了。但是getchildren() 也只返回直系子级。新的list(elem.iter()) 的旧等价物是list(elem.getiterator())。这取决于史蒂文真正想要什么。
    【解决方案2】:

    在 pydoc 中提到在节点上使用 list() 方法来获取子元素。
    list(elem)

    【讨论】:

      【解决方案3】:

      如果要获取所有元素'a',可以使用:

      a_lst = list(elem.iter('a'))
      

      如果elem 也是'a',它将被包括在内。

      【讨论】:

        【解决方案4】:

        也许这与 OP 实际问题不对应,但从更广泛的意义上说,我建议如果有人想要获得以特定名称命名的所有元素,例如'object' 可以使用(@Turtles Are Cute 的替代方法至少在我看来更自然):

        objs = tree.findall('object')
        

        它也返回一个列表。

        【讨论】:

          【解决方案5】:

          现有答案都不会找到所有孩子。此解决方案使用 BeautifulSoup 而不是 ETree,但会找到所有子级,而不仅仅是顶级:

          from bs4 import BeautifulSoup    
          
          with open(filename) as f:
              soup = BeautifulSoup(f, 'xml')
          
          results = soup.find_all('element_name')
          

          【讨论】:

            猜你喜欢
            • 2016-01-10
            • 2023-03-18
            • 1970-01-01
            • 2022-01-11
            • 1970-01-01
            • 1970-01-01
            • 2021-12-25
            • 2015-05-05
            • 1970-01-01
            相关资源
            最近更新 更多