lis中的列表

2024-05-16 23:49:15 发布

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

第二条线的目的是什么?我们难道不一定要作为seed参数传入一个列表吗?我认为您可以在我们的tocrawl变量的所有区域中使用seed,而不是在列表中使用列表。在

def crawl_web(seed):
    tocrawl = [seed]
    crawled = []
    while tocrawl:
        page = tocrawl.pop()
        if page not in crawled:
            union(tocrawl, get_all_links(get_page(page)))
            crawled.append(page)
    return crawled

编辑:完整脚本-http://codepad.org/qxuzVkof


Tags: 目的web区域列表参数getifdef
3条回答

seed不是一个列表,而是一个项目,很可能是要爬网的第一个页面的URL。在

虽然可以更改函数的设计以允许多个种子URL,但这会使函数的签名复杂化-几乎每个调用方都只想从一个URL抓取。让函数修改调用者的变量也是一种不好的风格;如果函数将采用参数tocrawl,则必须记录(并让每个调用者都知道):

  • tocrawl表示作为初始起点的所有url
  • tocrawl必须是list(或兼容类型);普通的iterable不支持pop。它还必须符合union期望的属性。这是非常不和谐的。在
  • 如果函数退出,参数列表将为空。这意味着几乎所有的调用者都希望传递列表的副本。在
  • 如果函数异常退出,tocrawl将包含尚未爬网的url的快照。在

由于最后两点本质上意味着输入参数被破坏,一个更好的设计是使参数成为任意可编辑的,然后然后构造一个列表。这样,打电话的人就不用担心这些愚蠢的惯例了。在

还有一件事:与其编写自己的union实现并使用列表来存储所有已爬网的网站,您应该考虑在两个实例中使用^{},如下所示:

def crawl_web(seed):
    tocrawl = set([seed])
    crawled = set()
    while tocrawl:
        page = tocrawl.pop()
        if page not in crawled:
            tocrawl.update(get_all_links(get_page(page)))
            crawled.add(page)
    return crawled

dr您的seed值不是一个列表,tocrawl不应该是一个列表(它应该是一个支持联合的数据结构,例如set)

这是基本的图遍历算法。如果不了解一个变量的背景,很难解释它的重要性,所以请允许我过分放纵你。>;:)

网络是数学家们喜欢称之为图的东西。web上的每个地址都是图中的一个节点,一个链接(连接两个地址)称为。所以“爬网”就是在网络图中沿着链接边缘找到指向不同地址节点的路径。在

def crawl_web(seed):

在每一个节点,你都要检查新的节点来访问,你可以从当前的节点访问这些节点。但是您必须从某个地方开始;这里的代码通过将已知的、未访问的节点列表初始化为seed,从节点seed开始:

^{pr2}$

您还需要跟踪访问过的节点,这样就不会一直绕圈子:

    crawled = []

然后你必须开始你的穿越。继续爬网,直到没有更多节点可爬网。公司名称:

    while tocrawl:

循环的每次迭代都将访问另一个节点,我们从列表中获得该节点(最初只是seed节点),方法是从末尾弹出一个值:

        page = tocrawl.pop()

不要访问以前爬网的节点;只需继续:

        if page not in crawled:

我不认为在python中,你不能在列表上进行联合,你可能需要创建一个集合来执行以下操作:

            # union(tocrawl, get_all_links(get_page(page)))

但它的要点是,你收集了当前节点的所有边,并将它们的节点添加到列表中(set?)已知的,未绘制的地址。可以按以下方式定义列表联合函数,注意它不保留顺序:

def list_union(a, b):
    # "|" is the set union operator
    return list(set(a) | set(b))

最后,请记住您已经访问过当前地址!在链接圈中单击(循环是技术术语,循环如果节点自身有边)

     crawled.append(page)

所有的地址都可以从你的地址列表中找到。在

    return crawled

现在让我们来看看整个事情的来龙去脉:

def crawl_web(seed):
    tocrawl = [seed]
    crawled = []
    while tocrawl:
        page = tocrawl.pop()
        if page not in crawled:
            list_union(tocrawl, get_all_links(get_page(page)))
            crawled.append(page)
    return crawled

在这个算法中,seed是一个页面,而不是一个列表。在

tocrawl是一个堆栈,您可以在其中收集要访问的链接页面,以便找到更多链接。在

相关问题 更多 >