BS4基本概念
Beautiful Soup是一个可以从HTML或XML文件中提取数据的网页信息提取库
源码分析
· 安 装
pip install lxml
pip install bs4
推荐使用 lxml HTML作为解析器,因为效率更高
根据特殊情况,比如网页源代码本身有问题,可以切换到容错性更好的htmllib解析器
bs4的使用
快速开始
html_doc = """
<html>
<head>
<title>
The Dormouse's story
</title>
</head>
<body>
<p class="title">
<b>
The Dormouse's story
</b>
</p>
<p class="story">
Once upon a time there were three little sisters; and their names were
<a href="http://example.com/elsie" class="sister" id="link1">
Elsie
</a>,
<a href="http://example.com/lacie" class="sister" id="link2">
Lacie
</a> and
<a href="http://example.com/tillie" class="sister" id="link3">
Tillie
</a>;
and they lived at the bottom of a well.
</p>
<p class="story">
...
</p>
"""
#获取bs对象
· bs = BeautifulSoup(html_doc, 'lxml')
· print(bs.prettify()) # 漂亮打印,层次缩进
· print(bs.title) # 获取title标签内容<title> The Dormouse's story</title>
· print(bs.title.name) # 获取title标签名称title
· print(bs.title.string) # 获取title标签里面的文本内容 The Dormouse's story
· print(bs.p) # 获取第一个P段落
· print(bs.find_all('p')) # 获取所有p标签的段落,并返回列表
bs4的种类对象
· tag: 标签
· NavigableString: 可导航的字符串
· BeautifulSoup: bs对象
· Comment:注释
遍历文档树 遍历子节点
bs里面有三种情况,第一个是遍历,第二个是查找,第三个是修改
contents children descendants
· contents 返回的是一个所有子节点的列表
· children 返回的是一个子节点的迭代器(迭代器可遍历)
· descendants 返回的是一个生成器遍历子子孙孙
string / strings / stripped_strings
· string获取标签里面的内容
· strings 返回是一个生成器对象用过来获取多个标签内容
· stripped_strings 和strings基本一致 但是它可以把多余的空格去掉
文档树遍历——遍历父节点
parent 和 parents
· parent直接获得父节点
· parents获取所有的父节点
文档树遍历——遍历兄弟结点
· next_sibling 下一个兄弟结点
· previous_sibling 上一个兄弟结点
· next_siblings 下一个所有兄弟结点
· previous_siblings上一个所有兄弟结点
搜索树
· 字符串过滤器 (下文举例)
· 正则表达式过滤器 (用bs4模块也就不推荐再使用re正则表达式)
· 列表过滤器 (下文举例)
· True过滤器
find() 和 find_all()
· find() 方法返回搜索到得第一条数据
· find_all() 方法以列表形式返回所有搜索到得标签数据
· find_all() 方法参数
def find_all(self, name=None, attrs={}, recursive=True, text=None, limit=None, **kwargs):
· name: tag标签名称
· attr: 标签的属性
· recursive: 是否递归搜索
· text: 文本内容
· limit: 限制返回条数
· kwargs: 关键字参数
举例:
举例二:
需求1:获取所有的tr标签
需求2:获取第二个tr标签
需求3:获取所有 class 等于 even 的 tr 标签
需求4: 将所有id等于test,class也等于test的a标签提取出来
需求5: 获取所有a标签的href属性
需求6:获取所有职位信息(文本数据)
select() 方法
可以通过css选择器的方式来提取数据,需要掌握css语法
在 CSS 中,选择器是一种模式,用于选择需要添加样式的元素。
"CSS" 列指示该属性是在哪个 CSS 版本中定义的。(CSS1、CSS2 还是 CSS3。)
实例一:
需求1:通过标签来查找
需求2:通过类名来查找 .class
需求3:通过id来查找 #id
需求4:组合的方式
p标签下 id = "link1"
head元素下所有的title元素
第一个title元素下的文本
修改文档树
· 修改tag的名称和属性
· 修改string 属性赋值, 就相当于用当前的内容替代了原来的内容
· append() 向 tag中添加内容
· decompose() 修改删除段落,对于一些没有必要的文章段落可以给予删除