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
find 返回的是匹配的第一个结果,find_all 返回匹配的全部结果
htm
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实现咱们的功能