BeautifulSoup的提供了两个超级好用的方法(可能是你用bs方法中最常用的)。借助这两个函数,你可以通过表现的不同属性轻松过滤HTML(XML)文件,查找需要的标签组或单个标签。

首先find(),findAll()是当有了bs对象之后,获取标签组或者单个标签的函数。find()找到第一个满足条件的标签就返回,findAll()找到所有满足条件的标签返回。

 

看一下两个函数的参数,findAll多了一个limit参数。 #参数不是每次用的时候需要把所有参数都要写出来



findAll(tag,atributes,recursive,text,limit,keywords)
find(tag,atributes,recursive,text,keywords)



实例中多用findAll()函数,因为find()函数只返回一个,没有代表性。

 

①参数tag,可以使用参数tag表明需要查找的标签类型,tag可以是多个:



.findAll({'h1'}) #返回h1标签列表
.findAll({'h1','h2','h3'}) #返回h1-h3标题标签列表
.findAll({'h1','h2','h3','h4','h5','h6','h7'}) #返回所有标题标签的列表



②参数attribute,使用标签内的若干属性对应的属性值进行标签查找,属性值可以是多个



.findAll('span',{'class':{'green','red'}})  #返回class属性为red和green的span标签列表



③参数recursive,是否使用递归方法遍历每一个子标签,默认是开启,True。如果设置为False,findAll()只查找文档的一级标签。一般使用中,不用去动这个参数

④参数text,根据标签的文本内容去查找标签列表,通常配合正则表达式使用



nameList = bsObj.findAll(text='the prince') #匹配所有标签文本内容为‘the prince’的标签列表



nameList = bsObj.findAll(text=re.compile('the*')) #匹配所有标签文本内容为‘the’开头的标签列表,使用了正则表达式re,正则表达式在此文中不做讲解



⑤参数limit,范围限制参数,显然只能用于findAll()函数。就是限定返回的个数,比如要抽取多少个标签信息做样本之类的

⑥参数keyword,标签内指定属性的标签列表#与attribute参数相似,有一个例外就是用class属性查找标签的时候,直接findAll(class=‘green’)会报错,因为class是保留字



bsObj.findAll(id='text')
bsObj.findAll(class='text')  #会报错
bsObj.findAll(class_='text')解决方案