我有这种方法,当提供链接列表时,将获得子链接,依此类推,等等。
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建议