BeautifulSoup的find()和findAll()的异同

BeautifulSoup(以下简称BS)中的find()和findAll()函数是做网络爬虫里最常用的两个函数,借助他们,可以通过网页标签的不同属性轻松的过滤HTML页面,查找需要的标签组或单个标签。

这个两个函数非常相似,在官方文档中的定义如下:

finaAll(tag,attributes,recursive,text,limit,keywords)
fina(tag,attributes,recursive,text,keywords)

我们可以发现平常在进行网络数据爬取的时候通常只需要用到前两个参数:tag和attributes,但其他参数在有些时候也可以使用来增加代码的可用性,那么接下来逐一介绍各个参数的含义:

  • 标签参数 tag
    标签参数:你可以传一个标签的名称或者多个标签的名称组成的Python列表作为标签参数,如下面的代码将返回一个包含HTML文档中所有标题标签的列表:

.findAll({"h1","h2","h3","h4","h5"})

  • 属性参数atrributes
    属性参数:是一个用Python字典封装的一个标签的若干属性和对应的属性值。如下面的代码将会返回HTML文档中红色和绿色两种颜色的span标签:

.findall("span",{"class":{"green","red"}})

  • 递归参数recursive
    递归参数:递归参数是一个布尔型变量,如果recursive的值为True。findAll就会根据要求去查找标签参数的所有子标签,以及子标签的子标签。反之,如果recursive的值为False的话。findAll就只查找一级标签,而不会去往下查找子标签,findAll()函数的recursive的默认设置为True,一般情况下,这个参数不需要设置,除非你真正了解自己需要哪些信息,而且抓取速度很重要,才会用到该参数。
  • 文本参数text
    文本参数:文本参数是使用标签的文本内容去匹配,而不是用标签的属性。假如我们需要查找网页中包含“hello”内容的标签数量,我们可以使用如下代码:

.findAll(text = "hello")

  • 范围限制参数limit
    范围限制参数:从函数定义中可以看出该参数只能应用与findAll()函数,事实上,find()函数就等同于findAll()函数中的limit等于1的时候,如果你只对网页中获取的前x项结果感兴趣,就可以将limit的值设置为x。需要注意的是,这个参数设置之后,获得的前几项结果是按照标签的排序,可能并非是想要的那几项。
  • 关键词参数keyword
    关键词参数:可以选择那些具有指定属性的标签,例如下面代码
    关键词参数注意事项:当使用class属性进行标签查找时便会出现问题,因为class是Python中保留的关键字,所以不能够直接用作参数或者变量名,倘若一定要使用class,那么有两种解决方案(还是不建议用class做标签查找):1.在class后加短横线,即 class_ = “green”;2.可以讲class用大括号包起来,即{“class”:”green”}

.findAll(id = "hello")