如何从网站上使用Beautiful Soup(python)递归获取所有链接

cod*_*yfe 7 python beautifulsoup

我希望能够以递归方式从网站获取所有链接,然后按照这些链接获取这些网站的所有链接.深度应为5-10,以便返回它找到的所有链接的数组.最好使用美丽的汤/蟒蛇.谢谢!

到目前为止,我已经尝试了这个并且它不起作用....任何帮助将不胜感激.

from BeautifulSoup import BeautifulSoup
import urllib2

def getLinks(url):
    if (len(url)==0):
        return [url]
    else:
        files = [ ]
        page=urllib2.urlopen(url)
        soup=BeautifulSoup(page.read())
        universities=soup.findAll('a',{'class':'institution'})
        for eachuniversity in universities:
           files+=getLinks(eachuniversity['href'])
        return files

print getLinks("http://www.utexas.edu/world/univ/alpha/")
Run Code Online (Sandbox Code Playgroud)

JGa*_*llo 3

递归算法用于将大问题简化为具有相同结构的小问题,然后组合结果。它们通常由一个不会导致递归的基本情况和另一个导致递归的情况组成。例如,假设您出生于 1986 年,您想计算您的年龄。你可以写:

def myAge(currentyear):
    if currentyear == 1986: #Base case, does not lead to recursion.
        return 0
    else:                   #Leads to recursion
        return 1+myAge(currentyear-1)
Run Code Online (Sandbox Code Playgroud)

我本人并不真正认为在您的问题中使用递归有什么意义。我的建议是首先在代码中设置限制。你给我们的东西将无限运行,因为程序陷入无限嵌套的 for 循环中;它永远不会到达终点并开始返回。因此,您可以在函数外部设置一个变量,该变量每次下降一个级别时都会更新,并在某个点停止函数启动新的 for 循环并开始返回它找到的内容。

但随后你开始改变全局变量,你以一种奇怪的方式使用递归,代码变得混乱。

现在阅读评论并看到您真正想要的内容,我必须说,这并不是很清楚,您可以在代码中使用递归算法的帮助,但不能递归地编写所有内容。

def recursiveUrl(url,depth):

    if depth == 5:
        return url
    else:
        page=urllib2.urlopen(url)
        soup = BeautifulSoup(page.read())
        newlink = soup.find('a') #find just the first one
        if len(newlink) == 0:
            return url
        else:
            return url, recursiveUrl(newlink,depth+1)


def getLinks(url):
    page=urllib2.urlopen(url)
    soup = BeautifulSoup(page.read())
    links = soup.find_all('a', {'class':'institution'})
    for link in links:
        links.append(recursiveUrl(link,0))
    return links
Run Code Online (Sandbox Code Playgroud)

现在仍然存在一个问题:链接并不总是链接到网页,还链接到文件和图像。这就是为什么我在“url-opening”函数的递归部分编写了 if/else 语句。另一个问题是你的第一个网站有2166个机构链接,创建2166*5 beautifulSoups并不快。上面的代码运行了一个递归函数 2166 次。这应该不是问题,但您正在处理大的 html(或 php 等)文件,因此制作 2166*5 的汤需要花费大量时间。