python-69:find() 和 find_all()

find 和 find_all()的详细说明和使用方法在BS4文档的"搜索文档树" 这一章节里面,这一章节的内容对爬虫来讲很重要,并且也不是不少,建议你们仍是认真的学习这一小部分的内容,我这里就简单的讲解一下,首先,第一个问题html

1. find 和 find_all 能用来作什么?
python

find 和 find_all 是BeautifulSoup 定义的两种文档树的搜索方法。正则表达式

这个"文档树"是什么?文档树就是BS实例的内容,若是BS的实例是一个网页的源码,那么这个源码就是文档树,若是是一段文字或者一句话甚至是一串字符串,那它们也是一个文档树。因此,更通俗的理解就是,find 和 find_all()够帮助咱们在文档树中寻找咱们想要的内容。函数

2. find 和 find_all 的区别学习

find 和 find_all 两个函数的参数同样,使用方法也差很少,因此这里先说明一下它们的区别,其实也很简单:code

  1. find 返回的是匹配的第一个结果,find_all 返回匹配的全部结果
    htm

  2. find 直接将结果返回,find_all 将结果做为一个列表返回文档

3. find 和 find_all 怎么使用字符串

两个函数的函数原型以下:原型

find_all( name , attrs , recursive , text , **kwargs )
find( name , attrs , recursive , text , **kwargs )

这两个函数的基本参数是同样的,用法也大体相同,那么,咱们就来看看这些参数都有什么含义吧

1. name:name 参数能够查找全部名字为 name 的tag

这里要明确两个问题:

    1. "查找全部名字为 name 的tag" 说明name参数只能对tag进行操做

    2. name的值能够是什么?

name的值能够有不少,标签,字符串,RE,甚至是函数方法等等,咱们来详细的看一下

  1 最简单用法是仅仅给定一个tag name值。下面的代码寻找文档中全部的 <B>  

soup.find_all('b')

  2 传一个正则表达式。下面的代码寻找全部以b开头的标签:      

soup.find_all(re.compile('^b'))

   3 传一个list或dictionary。下面两个调用是查找全部的<TITLE>和<P>标签。 他们得到结果同样,可是后一种方法更快一些:   

soup.find_all(['title', 'p'])
soup.find_all({'title' : True, 'p' : True})

  4 传一个True值,这样能够匹配每一个tag的name:也就是匹配每一个tag。

soup.find_all(True)

  5 先定义一个函数或者方法,并将它传入

def has_class_but_no_id(tag):
    return tag.has_attr('class') and not tag.has_attr('id')
将这个方法做为参数传入 find_all() 方法,将获得全部<p>标签:
soup.find_all(has_class_but_no_id)

 2. keyword:keyword参数上面并无,可是这倒是一个很重要的参数,它可以帮咱们筛选tag的属性,下面这个例子是查找拥有属性align且值为center的 全部标签:

soup.find_all(align="center")

它跟name参数同样,也能够传入不一样的值

3. attrs:attrs是一个字典,用起来就和keyword参数同样,你可使用attrs去匹配那些名字为Python保留字的属性, 例如class, for, 以及import; 或者那些跟Beautiful Soup函数名或者参数名相同的名字, 例如name, recursive, limit, text, 以及attrs自己

soup.find_all(attrs={'id' : re.compile("para$")})

4. text:text 参数用于搜索文档中的字符串内容.与 name 参数的可选值同样, text 参数接受 字符串 , 正则表达式 , 列表, True,下面的例子是搜索文档中含有"one" 的字符串

soup.find_all(text="one")

5. recursive:recursive 是一个布尔参数(默认为True),用于指定Beautiful Soup是否检索当前tag的全部子孙节点,下面的例子为不遍历当前tag的全部子孙节点

soup.html.find_all("title", recursive=False)

好了,这就是find和find_all的基本介绍,咱们下一小节来看看怎么使用find和find_all实现咱们的功能

相关文章
相关标签/搜索