BeautifulSoup最低共同的祖先

时间:2013-07-22 11:22:20

标签: python algorithm graph beautifulsoup

用于Python的BeautifulSoup库是否具有可以获取节点列表并返回最低共同祖先的任何函数?

如果没有,你们有没有实现过这样的功能并且愿意分享它?

3 个答案:

答案 0 :(得分:3)

我认为这就是你想要的,其中link1是一个元素,link2是另一个元素;

link_1_parents = list(link1.parents)[::-1]
link_2_parents = list(link2.parents)[::-1]

common_parent = [x for x,y in zip(link_1_parents, link_2_parents) if x is y][-1]

print common_parent
print common_parent.name

它基本上会从两个元素的父母那里走下来,然后返回最后一个普通的父母。

答案 1 :(得分:2)

如果输入列表中的标签到最低共同祖先的距离与输入中的每个节点不完全相同,则接受的答案不起作用。

它还使用每个节点的每个祖先,这是不必要的,在某些情况下可能非常昂贵。

import collections
def lowest_common_ancestor(parents=None, *args):
    if parents is None:
        parents = collections.defaultdict(int)
    for tag in args:
        if not tag:
            continue
        parents[tag] += 1
        if parents[tag] == len(args):
            return tag
    return lowest_common_ancestor(parents, *[tag.parent if tag else None for tag in args])

答案 2 :(得分:0)

由于亚瑟的答案在某些情况下不正确。我修改了Arthur的答案,并给出了答案。我已经测试了两个节点作为输入的LCA代码。

import collections
def lowest_common_ancestor(parents=None, *args):
    if parents is None:
        parents = collections.defaultdict(int)
    for tag in args:
        parents[tag] += 1
        if parents[tag] == NUM_OF_NODES:
            return tag
    next_arg_list = [tag.parent for tag in args if tag.parent is not None]

    return lowest_common_ancestor(parents, *next_arg_list)

调用函数:

list_of_tag = [tag_a, tag_b]
NUM_OF_NODES = len(list_of_tag)
lca = lowest_common_ancestor(None, *list_of_tag)
print(lca)