find_all( name , attrs , recursive , string , **kwargs ) find_all() 方法搜索当前tag的全部tag子节点,并判断是否符合过滤器的条件
这是最简单而直接的一种办法了,我么能够经过html标签名来索引; sb = soup.find_all('img')
所谓关键字参数其实就是经过一个html标签的id、href(这个主要指的是a标签的 )和title,我测试了class,这个方法好像不行,不过没有关系,下面我会谈到这个点的! soup.find_all(href=re.compile("elsie")) # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>] soup.find_all(id='link2') # [<a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>] 这里的true指的就是选中全部有id这个属性的标签; soup.find_all(id=True) # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] 固然还能够设置多个筛选的属性; soup.find_all(href=re.compile("elsie"), id='link1') # [<a class="sister" href="http://example.com/elsie" id="link1">three</a>] 还有有些属性在搜索时就不能使用,就好比HTML5中的 data-* 属性,咋办? data_soup = BeautifulSoup('<div data-foo="value">foo!</div>') data_soup.find_all(data-foo="value") # SyntaxError: keyword can't be an expression 可是能够经过 find_all() 方法的 attrs 参数定义一个字典参数来搜索包含特殊属性的tag: data_soup.find_all(attrs={"data-foo": "value"}) # [<div data-foo="value">foo!</div>] 虽然咱们不能像id他们那样使用,由于class在python中是保留字(保留字(reserved word),指在高级语言中已经定义过的字,使用者不能再将这些字做为变量名或过程名使用。 ),因此呢,直接使用是回报错的,因此class_应运而生; 因此呢,顺便上一张图片,让咱们看一看python都有哪些保留字:  经过标签名和属性名一块儿用: soup.find_all("a", class_="sister") # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>] 除此以外呢,还有就是class_ 参数一样接受不一样类型的 过滤器 ,字符串,正则表达式,方法或 True :固然,上面的属性也能够和标签名结合起来使用; soup.find_all(class_=re.compile("itl")) # [<p class="title"><b>The Dormouse's story</b></p>] def has_six_characters(css_class): return css_class is not None and len(css_class) == 6 soup.find_all(class_=has_six_characters) #这里的这个函数,其实就是一个布尔值True; # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>, # <a class="sister" href="http://example.com/tillie" id="link3">Tillie</a>]
经过 string 参数能够搜搜文档中的字符串内容.与 name 参数的可选值同样, string 参数接受 字符串 , 正则表达式 , 列表, True;css
soup.find_all("a", string="Elsie") # [<a href="http://example.com/elsie" class="sister" id="link1">Elsie</a>]
这个参数其实就是控制咱们获取数据的数量,效果和SQL语句中的limit同样;html
soup.find_all("a", limit=2) # [<a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>, # <a class="sister" href="http://example.com/lacie" id="link2">Lacie</a>]
调用tag的 find_all() 方法时,Beautiful Soup会检索当前tag的全部子孙节点,若是只想搜索tag的直接子节点,可使用参数 recursive=False;
Html:python
<html> <head> <title> The Dormouse's story </title> </head> ...
python:正则表达式
soup.html.find_all("title") # [<title>The Dormouse's story</title>] soup.html.find_all("title", recursive=False) # []
因此他只获取本身的直接子节点,也就是他本身,这个标签本身就是他的直接子节点;express