python学习之----BeautifulSoup的find()和findAll()及四大对象

BeautifulSoup 里的find() 和findAll() 可能是你最常用的两个函数。借助它们,你可以通

过标签的不同属性轻松地过滤HTML 页面,查找需要的标签组或单个标签。

这两个函数非常相似,BeautifulSoup 文档里两者的定义就是这样:

findAll(tag, attributes, recursive, text, limit, keywords)

find(tag, attributes, recursive, text, keywords)

很可能你会发现,自己在95% 的时间里都只需要使用前两个参数:tag 和attributes。但

是,我们还是应该仔细地观察所有的参数。

标签参数tag 前面已经介绍过——你可以传一个标签的名称或多个标签名称组成的Python

列表做标签参数。例如,下面的代码将返回一个包含HTML 文档中所有标题标签的列表:1

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

属性参数attributes 是用一个Python 字典封装一个标签的若干属性和对应的属性值。例

如,下面这个函数会返回HTML 文档里红色与绿色两种颜色的span 标签:

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

递归参数recursive 是一个布尔变量。你想抓取HTML 文档标签结构里多少层的信息?如果

recursive 设置为True,findAll 就会根据你的要求去查找标签参数的所有子标签,以及子

标签的子标签。如果recursive 设置为False,findAll 就只查找文档的一级标签。findAll

默认是支持递归查找的(recursive 默认值是True);一般情况下这个参数不需要设置,除

非你真正了解自己需要哪些信息,而且抓取速度非常重要,那时你可以设置递归参数。

文本参数text 有点不同,它是用标签的文本内容去匹配,而不是用标签的属性。假如我们

想查找前面网页中包含“the prince”内容的标签数量,我们可以把之前的findAll 方法换

成下面的代码:

nameList = bsObj.findAll(text="the prince")

print(len(nameList))

输出结果为“7”。

范围限制参数limit,显然只用于findAll 方法。find 其实等价于findAll 的limit 等于

1 时的情形。如果你只对网页中获取的前x 项结果感兴趣,就可以设置它。但是要注意,

这个参数设置之后,获得的前几项结果是按照网页上的顺序排序的,未必是你想要的那

前几项。

还有一个关键词参数keyword,可以让你选择那些具有指定属性的标签。例如:

allText = bsObj.findAll(id="text")

print(allText[0].get_text())

关键词参数的注意事项

虽然关键词参数keyword 在一些场景中很有用,但是,它是BeautifulSoup 在

技术上做的一个冗余功能。任何用关键词参数能够完成的任务,同样可以用

其他技术解决

例如,下面两行代码是完全一样的:

bsObj.findAll(id="text")

bsObj.findAll("", {"id":"text"})

另外,用keyword 偶尔会出现问题,尤其是在用class 属性查找标签的时候,

因为class 是Python 中受保护的关键字。也就是说,class 是Python 语言

的保留字,在Python 程序里是不能当作变量或参数名使用的(和前面介绍

的BeautifulSoup.findAll() 里的keyword 无关)2。假如你运行下面的代码,

Python 就会因为你误用class 保留字而产生一个语法错误:

bsObj.findAll(class="green")

不过,你可以用BeautifulSoup 提供的有点儿臃肿的方案,在class 后面增加

一个下划线:

bsObj.findAll(class_="green")

另外,你也可以用属性参数把class 用引号包起来:

bsObj.findAll("", {"class":"green"})

看到这里,你可能会扪心自问:“现在我是不是已经知道如何用标签属性获取一组标签

了——用字典把属性传到函数里就行了?”

回忆一下前面的内容,通过标签参数tag 把标签列表传到.findAll() 里获取一列标签,其

实就是一个“或”关系的过滤器(即选择所有带标签1 或标签2 或标签3……的一列标

签)。如果你的标签列表很长,就需要花很长时间才能写完。而关键词参数keyword 可以让

你增加一个“与”关系的过滤器来简化工作。

BeautifulSoup的四大对象

• BeautifulSoup 对象

前面代码示例中的bsObj

• 标签Tag 对象

BeautifulSoup 对象通过find 和findAll,或者直接调用子标签获取的一列对象或单个

对象

NavigableString 对象

用来表示标签里的文字,不是标签(有些函数可以操作和生成NavigableString 对象,

而不是标签对象)。

• Comment 对象

用来查找HTML 文档的注释标签,<!-- 像这样 -->

这四个对象是你用BeautifulSoup 库时会遇到的所有对象。

上一篇:VFS四大对象之三 struct dentry


下一篇:SAS-决策树模型