首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >如何使用Beautiful Soup (python)递归地从网站获取所有链接

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

Stack Overflow用户
提问于 2013-11-26 01:04:59
回答 2查看 11.7K关注 0票数 7

我希望能够递归地从一个网站获得所有链接,然后跟随这些链接,并从这些网站获得所有链接。深度应该是5-10,这样它就会返回一个包含找到的所有链接的数组。最好是用漂亮的汤/蟒蛇。谢谢!

我已经尝试了到目前为止,它不是working....any帮助将不胜感激。

代码语言:javascript
复制
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/")
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2013-11-26 02:18:43

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

代码语言:javascript
复制
def myAge(currentyear):
    if currentyear == 1986: #Base case, does not lead to recursion.
        return 0
    else:                   #Leads to recursion
        return 1+myAge(currentyear-1)

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

但是当你开始改变全局变量时,你会以一种奇怪的方式使用递归,并且代码变得混乱。

现在阅读注释,看看你真正想要的是什么,我必须说,这并不是真的很清楚,你可以在你的代码中使用递归算法的帮助,但不是递归地编写所有的代码。

代码语言:javascript
复制
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

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

票数 1
EN

Stack Overflow用户

发布于 2013-11-26 02:30:35

爬行页面的数量将呈指数级增长,其中涉及的许多问题乍一看可能并不复杂,请查看scrapy体系结构概述以了解在现实生活中应该如何做

在其他强大的功能中,scrapy不会重复抓取相同的页面(除非你强制它这样做),并且可以配置为最大DEPTH_LIMIT

更棒的是,scrapy有一个内置的链接提取工具link-extractors

票数 4
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/20198934

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档