为了账号安全,请及时绑定邮箱和手机立即绑定

xml.etree.ElementTree获取节点深度

xml.etree.ElementTree获取节点深度

慕村225694 2021-03-31 21:38:54
XML:<?xml version="1.0"?><pages>    <page>        <url>http://example.com/Labs</url>        <title>Labs</title>        <subpages>            <page>                <url>http://example.com/Labs/Email</url>                <title>Email</title>                <subpages>                    <page/>                    <url>http://example.com/Labs/Email/How_to</url>                    <title>How-To</title>                </subpages>            </page>            <page>                <url>http://example.com/Labs/Social</url>                <title>Social</title>            </page>        </subpages>    </page>    <page>        <url>http://example.com/Tests</url>        <title>Tests</title>        <subpages>            <page>                <url>http://example.com/Tests/Email</url>                <title>Email</title>                <subpages>                    <page/>                    <url>http://example.com/Tests/Email/How_to</url>                    <title>How-To</title>                </subpages>            </page>            <page>                <url>http://example.com/Tests/Social</url>                <title>Social</title>            </page>        </subpages>    </page></pages>代码:// rexml is the XML string read from a URLfrom xml.etree import ElementTree as ETtree = ET.fromstring(rexml)for node in tree.iter('page'):    for url in node.iterfind('url'):        print url.text    for title in node.iterfind('title'):        print title.text.encode("utf-8")    print '-' * 30输出:http://example.com/article1Article1------------------------------http://example.com/article1/subarticle1SubArticle1------------------------------http://example.com/article2Article2------------------------------http://example.com/article3Article3------------------------------Xml表示树状的站点地图结构。我整天在文档和Google上翻腾,无法弄清楚获取条目的节点深度。我使用了子容器的计数方法,但是它仅适用于第一个父容器,然后由于无法弄清如何重置而中断。但这可能只是一个骇人听闻的想法。
查看完整描述

2 回答

?
翻翻过去那场雪

TA贡献2065条经验 获得超14个赞

lxml.html。


import lxml.html


rexml = ...


def depth(node):

    d = 0

    while node is not None:

        d += 1

        node = node.getparent()

    return d


tree = lxml.html.fromstring(rexml)

for node in tree.iter('page'):

    print depth(node)

    for url in node.iterfind('url'):

        print url.text

    for title in node.iterfind('title'):

        print title.text.encode("utf-8")

    print '-' * 30


查看完整回答
反对 回复 2021-04-05
?
动漫人物

TA贡献1815条经验 获得超10个赞

Python ElementTreeAPI为XML树的深度优先遍历提供了迭代器-不幸的是,这些迭代器没有向调用者提供任何深度信息。


但是您可以编写一个深度优先的迭代器,该迭代器还返回每个元素的深度信息:


import xml.etree.ElementTree as ET


def depth_iter(element, tag=None):

    stack = []

    stack.append(iter([element]))

    while stack:

        e = next(stack[-1], None)

        if e == None:

            stack.pop()

        else:

            stack.append(iter(e))

            if tag == None or e.tag == tag:

                yield (e, len(stack) - 1)

注意,这是比通过以下父链接确定深度更有效的(在使用lxml) -即它是O(n)与O(n log n)。


查看完整回答
反对 回复 2021-04-05
  • 2 回答
  • 0 关注
  • 403 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信