【问题标题】:Mapping URL redirections with Anytree (without duplicates)使用 Anytree 映射 URL 重定向(不重复)
【发布时间】:2019-08-16 00:17:04
【问题描述】:

我正在尝试使用 Python AnyTree 模块将 URL 重定向映射到树中,而不创建任何重复节点。

我尝试使用 AnyTree 文档和类似问题来处理代码,例如Tree with no duplicate children

我当前的代码是:

from anytree import Node, RenderTree

root_nodes = []

for url in redirections:
    is_root = True
    for redir in redirections:
        if url['url'] == redir['redir']:
            is_root = False
    if is_root:
        root = Node(url['url'])
        root_nodes.append(root)


for root in root_nodes:
    for redir in redirections:
        if redir['url'] == root.name:
            sub = Node(redir['redir'], parent=root)
        else:
            sub = next((c for c in root.children if c.name == redir['url']), None)
            if sub is None:
                sub = Node(redir['redir'], parent=root)
            else:
                new_node = sub
                sub = Node(redir['redir'], parent=new_node)

基本上,给定一个重定向列表,例如:

redirections = [
    {
        'url': "alpha.com",
        'redir_url': "beta.com",
    },
    {
        'url': "alpha.com",
        'redir_url': "charlie.com",
    },
    {
        'url': "beta.com",
        'redir_url': "charlie.com",
    },
    {
        'url': "beta.com",
        'redir_url': "delta.com",
    },
    {
        'url': "delta.com",
        'redir_url': "foxtrot.com",
    },
    {
        'url': "foxtrot.com",
        'redir_url': "golf.com",
    },
    {
        'url': "india.com",
        'redir_url': "charlie.com",
    },
    {
        'url': "india.com",
        'redir_url': "juliet.com",
    },
]

我希望 AnyTree 产生如下输出:

alpha.com -> beta.com -> charlie.com
                      -> delta.com -> foxtrot.com -> golf.com
          -> charlie.com

india.com -> charlie.com
          -> juliet.com

相反,它当前打印:

alpha.com
├── beta.com
│   ├── charlie.com
│   └── delta.com
├── charlie.com
├── foxtrot.com
│   └── golf.com
├── charlie.com
└── juliet.com
india.com
├── beta.com
│   ├── charlie.com
│   └── delta.com
├── charlie.com
├── foxtrot.com
│   └── golf.com
├── charlie.com
└── juliet.com

如您所见,有很多重复项。此外,狐步舞和高尔夫也没有添加到三角链中。最后,印度还有那些不会从这些 URL 发生的人重定向。

请注意,重定向数组可以是任何顺序(不一定是重定向发生的顺序)

【问题讨论】:

    标签: python anytree


    【解决方案1】:

    您需要一个知道所有节点并正确链接它们的容器。

    from anytree import Node, RenderTree
    
    redirections = [
        {
            'url': "alpha.com",
            'redir_url': "beta.com",
        },
        {
            'url': "alpha.com",
            'redir_url': "charlie.com",
        },
        {
            'url': "beta.com",
            'redir_url': "charlie.com",
        },
        {
            'url': "beta.com",
            'redir_url': "delta.com",
        },
        {
            'url': "delta.com",
            'redir_url': "foxtrot.com",
        },
        {
            'url': "foxtrot.com",
            'redir_url': "golf.com",
        },
        {
            'url': "india.com",
            'redir_url': "charlie.com",
        },
        {
            'url': "india.com",
            'redir_url': "juliet.com",
        },
    ]
    
    
    class Fab:
    
        def __init__(self):
            self.nodemap = {}
    
        @property
        def roots(self):
            return [node for node in self.nodemap.values() if node.is_root]
    
        def create(self, name=None, parentname=None):
            node = self._create(name)
            if parentname is not None:
                self._create(parentname).parent = node
    
        def _create(self, name):
            nodemap = self.nodemap
            if name not in nodemap:
                node = nodemap[name] = Node(name)
            else:
                node = nodemap[name]
            return node
    
    
    f = Fab()
    for redirect in redirections:
        url = redirect['url']
        redir_url = redirect['redir_url']
        f.create(url, redir_url)
    
    for root in f.roots:
        for pre, fill, node in RenderTree(root):
            print("%s%s" % (pre, node.name))
    

    这会给你

    alpha.com
    └── beta.com
        └── delta.com
            └── foxtrot.com
                └── golf.com
    india.com
    ├── charlie.com
    └── juliet.com
    

    我将添加一个通用节点工厂来解决这个问题:https://github.com/c0fec0de/anytree/issues/122

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2016-08-30
      • 2013-06-12
      • 2012-10-22
      • 1970-01-01
      • 1970-01-01
      • 2020-05-31
      • 2011-04-21
      • 1970-01-01
      相关资源
      最近更新 更多