我有这种方法,当提供链接列表时,将获得子链接,依此类推,等等。

def crawlSite(self, linksList):
    finalList = []
    for link in list(linksList):
        if link not in finalList:
            print link
            finalList.append(link)
            childLinks = self.getAllUniqueLinks(link)
            length = len(childLinks)
            print 'Total links for this page: ' + str(length)

        self.crawlSite(childLinks)
    return finalList


最终它将用相同的一组链接重复进行,而我似乎无法弄清楚。当我将self.crawlSite(childLinks)移动到if语句中时。我一遍又一遍地得到列表中的第一项。

self.getAllUniqueLinks(link)方法的背景获取给定页面的链接列表。它过滤给定域内的所有可点击链接。基本上,我想做的是从网站上获取所有可点击的链接。如果这不是理想的方法。您能推荐一种可以做完全相同的事情的更好的方法吗?还请考虑我对python还是相当陌生,可能不了解更复杂的方法。因此,请说明您的思考过程。如果您不介意:)

最佳答案

你需要

finalList.extend(self.crawlSite(childLinks))


不只是

self.crawlSite(childLinks)


您需要将内部crawlSite()返回的列表与外部crawlSite()中已经存在的列表合并。即使它们都被称为finalList,您在每个范围中都有一个不同的列表。

另一种(更好的)解决方案是让finalList是一个实例变量(或某种类型的非局部变量),而不仅仅是局部变量,以便它由crawlSite()的所有作用域共享:

def __init__(self, *args, **kwargs):
    self.finalList = set()

def crawlSite(self, linksList):
    for link in linksList:
        if link not in self.finalList:
            print link
            self.finalList.add(link)
            childLinks = self.getAllUniqueLinks(link)
            length = len(childLinks)
            print 'Total links for this page: ' + str(length)
            self.crawlSite(childLinks)


如果要从头开始使用同一实例,则只需确保self.finalList = []

编辑:通过将递归调用放在if块中来修复代码。用了一套。另外,linksList不必是列表,而只是一个可迭代的对象,因此从list()循环中删除了for调用。设置由@ Ray-Toal建议

09-16 19:18