开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第23天,点击查看活动详情
简介
BeautifulSoup简称bs4
,它和xml
一样,是一个html
的解析器,主要功能也是解析和提取数据,与xml
相比,其优点是接口设计人性化,使用便捷,缺点则是没有lxml
的效率高。
安装以及对象创建
1. 安装
pip install bs4
2. 导入
from bs4 import BeautifulSoup
3. 创建对象
# 服务器响应的文件生成对象
soup = BeautifulSoup(response.read().decode('utf-8'), 'lxml')
# 本地文件生成对象
soup = BeautifulSoup(open('xxx.html', encoding='utf-8'), 'lxml')
基本使用
案例页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>bs4Demo</title>
</head>
<body>
<div>
<ul>
<li>
<a id="a1" href="https://juejin.cn/">掘金-首页</a>
</li>
</ul>
</div>
<a id="a2" href="https://juejin.cn/pins" title="pins">掘金-沸点</a>
<a href="https://juejin.cn/pins" title="pins" class="juejin">掘金-沸点</a>
<span id="sp">SPAN标签</span>
</body>
</html>
1. 根据标签名查找节点
# 根据标签名查找节点(只匹配第一个节点)
print(soup.a)
# 获取标签的属性和属性值
print(soup.a.attrs)
2. 函数
find
# 相当于 soup.a,返回的是第一个符合条件的数据
print("a:", soup.find('a'))
# 根据 title的值,找到第一个符合条件的对象
print("title:", soup.find('a', title='pins'))
# 根据 class_的值,找到第一个符合条件的对象(class属性是python中的关键字,需要添加下划线区分)
print("class_:", soup.find('a', class_='juejin'))
find_all
# 返回所有 a 标签
print(soup.find_all('a'))
# 多标签查询需要传入一个列表参数
print(soup.find_all(['a', 'span']))
# 查询前N条数据
print(soup.find_all('a', limit=2))
select
# 查询所有指定的标签列表
print(soup.select('a'))
# 类选择器,通过 . 加上 class属性值查询符合条件的标签列表
print(soup.select('.juejin'))
# ID选择器,通过 # 加上 id属性值查询符合条件的标签列表
print(soup.select('#sp'))
# 属性选择器,查找到 a 标签中有id属性的标签
print(soup.select('a[id]'))
# 属性选择器,查找到 a 标签中有id属性且值为 a1 的标签
print(soup.select('a[id="a1"]'))
# 层级选择器,找到 div 标签下的 a 标签(后代选择器)
print(soup.select('div a'))
# 层级选择器,找到 div 标签下的 a 标签(子代选择器)
print(soup.select('div > a'))
print(soup.select('div > ul > li > a'))
3. 节点信息
演示页面
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>bs4Demo</title>
</head>
<body>
<div id="a1">
<span>
掘金
</span>
</div>
<p id="pid" class="p_class"></p>
</body>
</html>
from bs4 import BeautifulSoup
soup = BeautifulSoup(open('bs4_2.html', encoding='utf-8'), 'lxml')
# 节点信息
# 获取节点内容
# string 只能获取到标签中仅有纯文本的内容
print(soup.select('#a1')[0].string)
# get_text() 可以获取到标签中嵌套子标签中的数据
print(soup.select('#a1')[0].get_text())
# 获取节点的属性值
# 通过 attrs 获取到标签的属性,该类型为字典类型,可通过以下三种方式获取属性值
p = soup.select('#pid')[0]
print(p.attrs.get('class'))
print(p.get('class'))
print(p['class'])