如何获取beautiful soup中递归节点的最内部XML

2024-07-08 16:10:21 发布

您现在位置:Python中文网/ 问答频道 /正文

使用此代码

<BrowseNodes>
    <BrowseNode>
        <BrowseNodeId>3404981</BrowseNodeId>
        <Name>Tires</Name>
        <Ancestors>
            <BrowseNode>
                <BrowseNodeId>6388965011</BrowseNodeId>
                <Name>Tires & Tubes</Name>
                <Ancestors>
                    <BrowseNode>
                        <BrowseNodeId>3403201</BrowseNodeId>
                        <Name>Cycling</Name>
                        <Ancestors>
                            <BrowseNode>
                                <BrowseNodeId>3375301</BrowseNodeId>
                                <Name>Categories</Name>
                                <IsCategoryRoot>1</IsCategoryRoot>
                                <Ancestors>
                                    <BrowseNode>
                                        <BrowseNodeId>3375251</BrowseNodeId>
                                        <Name>Sports & Outdoors</Name>
                                    </BrowseNode>
                                </Ancestors>
                            </BrowseNode>
                        </Ancestors>
                    </BrowseNode>
                </Ancestors>
            </BrowseNode>
        </Ancestors>
    </BrowseNode>
</BrowseNodes>

我试着用靓汤来获得最里面的节点。在这里是“运动和户外运动”。因为我不知道一个BrowseNode可以分为多少层,如果假设最内部的层是我需要的根,那么如何获得最内部的层呢?在

谢谢


Tags: 代码name节点categoriessportstubescyclingoutdoors
2条回答

如果您可以相信每个BrowseNode都有一个BrowseNode子代或没有,这很简单:

def deepest(root, tag):
   descendant = root.find(tag)
   if descendant:
       return deepest(descendant, tag)
   return root

(你可以说得更简洁些,但我想让逻辑尽可能地清晰明了。)

如果一个BrowseNode可能有2个或多个BrowseNode子代,并且必须找到最深的一个,则必须修改它以执行深度优先搜索。这并不难;您只需使deepest返回(level, node)而不是{},使用find_all代替{},然后执行max(deepest(descendant, tag) for descendant in descendants)。在

如果您真的需要在文档中的任何地方得到嵌套最深的一个,您可以查看所有这些嵌套,然后计算父级。对于非大型文档,性能应该是可以的。注意:这不处理两个这样的元素,它们的深度与同级元素相同或位于不同的位置。在

depths = (
    (elem, sum(1 for p in elem.parents if p.name == 'BrowseNode'))
    for elem in soup.findAll('BrowseNode'))
deepest_elem, deepest_depth = max(depths, key=lambda t:t[1])

相关问题 更多 >

    热门问题