【3】数据筛选3 - BeautifulSoup4
#目录
1. 开发前准备
2. 不同解析器对比
3. BeautifulSoup4 初始化和节点对象的认识
4. BS4 案例操作:初始化对象文档
5. 节点查询:子节点
6. 节点查询:父节点
7. 节点查询:兄弟节点
8. 节点查询:解析顺序
9. 高级查询: find/find_all 检索
10. 高级查询: CSS 选择器
----
1.开发前准备
- 官方文档: https://www.crummy.com/software/BeautifulSoup/bs4/doc/index.html
官方文档中文版: https://www.crummy.com/software/BeautifulSoup/bs4/doc.zh/ - 命令安装方式
pip install beautifulsoup4
easy_install beautifulsoup4
下载源码包(tar.gz)安装
python setup.py install - 安装解析器: BeautifulSoup4 本身只包含解析器接口规则,支持 python 内置的 HTML 解析器,同时支持第三方的一些解析器[如 lxml]
- 如果使用过程中没有指定使用解析器, BeautifulSoup4 会自动从当前的 python 环境中检索最优的解析器加载使用
pip install lxml
or
pip install html5lib
2.不同解析器对比
解析器 | 使用 | 优缺点 |
---|---|---|
标准库 | BeautifulSoup(html, ‘html.parser’) |
优点:内置标准库、执行速度适中、容错能力强. 缺点:对中文解析的容错能力有限 |
lxml | BeautifulSoup(html, ‘lxml’) |
优点:速度快,容错能力强 缺点:需要安装 c 语言库 |
lxml | BeautifulSoup(html, [‘lxml’, ‘xml’]) | 唯一支持 XML 的解析器 |
html5lib | BeautifulSoup(html, ‘html5lib’) |
优点:容错能力最好, 浏览器方式解析文档, 生成 H5 格式的文档 缺点:速度慢,不依赖外部扩展 |
- 综上所述,优先推荐使用 lxml 解析器
3.BeautifulSoup4 初始化和节点对象的认识
- BeautifulSoup4(BS4)可以将一个 html 文档数据流或者 html 文档对象或者 html 字符串,直接加载到 BS4 对象中,得到一个 BS4 的文档对象
--- from bs4 import BeautifulSoup
--- soup = BeautifulSoup(open(‘index.html’))
--- soup = BeautifulSoup(‘……’) - BeautifulSoup4 将 HTML 结构化文档, 解析为树形结构化数据,树形文档对象中主要包含四种对象
--- tag: 标签节点对象节点
--- name: 标签名称对象节点
--- attributes: 标签属性对象节点, like dict,如果是多值属性,属性对应的值就是一个 list 数据
--- NavigateString: 标签中文本对象节点,可以直接通过 unicode()函数将文本转换成 unicode 字符串
4.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> </body> </html> """ from bs4 import BeautifulSoup # 构建 bs4 文档对象 soup = BeautifulSoup(html_doc, 'lxml') print(type(soup)) # <class 'bs4.BeautifulSoup'>
5.节点查询: 子节点
# 节点名称查询
print(soup.title) # <title>The Dormouse's story</title>
print(soup.p) # <p class="title"><b>The Dormouse's story</b></p>
print(soup.a) # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
# 子节点查询
chs = soup.contents
print(type(chs), len(chs)) # <class 'list'> 2
chs2 = soup.children
print(type(chs2), len(list(chs2))) # <class 'list_iterator'> 2
# 包含节点查询
chs3 = soup.descendants
print(type(chs3), len(list(chs3))) # <class 'generator'> 28
# 子节点内容获取
# 获取节点内部文本数据
print(soup.title.string) # The Dormouse's story
# 获取文本节点的文本数据
print(soup.title.contents[0].string) # The Dormouse's story
# 如果包含子节点并且不是文本节点,返回 None
print(soup.body.string) # None
# 获取包含的所有文本数据,包括空白字符
print(soup.body.strings) # <generator object Tag._all_strings at 0x0000021B6360F6D8>
# 获取包含的所有文本数据,剔除空白字符
print(soup.body.stripped_strings) # <generator object Tag.stripped_strings at 0x0000022BBB38F6D8>
6.节点查询:父节点
# ##########################父节点查询print(soup.a) # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
# 查询直接父节点
print(soup.a.parent.name) # p
# 遍历查询所有父节点
print([tag.name for tag in soup.a.parents]) # ['p', 'body', 'html', '[document]']
7.节点查询: 兄弟节点
# ##########################兄弟节点# 获取当前节点
print(soup.a) # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
# 获取前一个兄弟节点:得到文本节点
print(soup.a.previous_sibling) # Once upon a time there were three little sisters; and their
names were
# 获取后一个兄弟节点:得到文本节点
print(soup.a.next_sibling) #,
# 获取所有的前面的兄弟节点:得到所有紧跟当前节点前面的兄弟节点的生成器对象
print(soup.a.previous_siblings) # <generator object PageElement.previous_siblings at
0x000001EF06B57750>
# 获取所有的后面的兄弟节点:得到所有紧跟当前节点后面的兄弟节点的生成器对象
print(soup.a.next_siblings) # <generator object PageElement.next_siblings at 0x0000018A1B41F6D8>
8.节点查询:解析顺序
BeautifulSoup4 提供了一种比较特殊的操作:按照文档的解析顺序进行节点的查询,解析顺序和浏览器解释 HTML 文档的顺序是一致的
# #########################解析顺序节点#获取当前节点
print(soup.a) # <a class="sister" href="http://example.com/elsie" id="link1">Elsie</a>
# 获取前一个兄弟节点:得到文本节点
print(soup.a.previous_element) # Once upon a time there were three little sisters; and their
names were
# 获取后一个兄弟节点:得到文本节点
print(soup.a.next_element) #Elsie
# 获取所有的前面的兄弟节点:得到所有紧跟当前节点前面的兄弟节点的生成器对象
print(soup.a.previous_elements) # <generator object PageElement.previous_elements at
0x0000013EC8C9F6D8>
# 获取所有的后面的兄弟节点:得到所有紧跟当前节点后面的兄弟节点的生成器对象
print(soup.a.next_elements) # <generator object PageElement.next_elements at 0x0000013EC8C9F6D8>
# 获取解析过程节点顺序
print([tag.name if tag.name else tag for tag in soup.html.next_elements])
➔ 解析结果:
['head', 'title', "The Dormouse's story", '\n', 'body', '\n', 'p', 'b', "The Dormouse's story", '\n',
'p', 'Once upon a time there were three little sisters; and their names were\n', 'a', 'Elsie', ',\n', 'a',
'Lacie', ' and\n', 'a', 'Tillie', ';\nand they lived at the bottom of a well.', '\n', 'p', '...', '\n', '\n',
'\n']
9.高级查询: find/find_all 检索
- find(name, attrs, recursive, text, **kwargs)
◼ 查询得到一个节点对象数据,如果结果不存在返回 None
◼ param name: 要查询的标签的名称
◼ param attrs: 要查询的属性字典,如{‘class’: ‘title’}
◼ param recursive: 是否查询所有包含的节点,默认 True
◼ param text: 查询的节点中包含的指定的内容
◼ param kwargs: 如果查询的属性不是内置的指定的属性,可以通过 kwargs 添加自定义属性 - find_all(name, attrs, recursive, text, limit, **kwargs)
◼ 查询得到一组节点对象数据,如果结果不存在返回[]
◼ param limit:查询的结果数量限制
◼ 其他参数参考 find(..) - 查询过滤操作
◼ 条件查询: find_all(‘p’, {‘class’: ‘title’})
◼ 并且查询: find_all([‘p’, ‘a’])
◼ 属性查询: find_all(id=’link2’)
◼ 正则查询: find_all(text=re.compile(‘sisters’))
◼ 指定属性查询: find_all(class_=’sister’) - 其他查询
◼ find_parent()/find_parents()
◼ find_previous_sibling()/find_previous_siblings()/find_next_sibling()/find_next_siblings()
◼ find_next()/find_all_next()/find_previous()/find_all_previous()
10. 高级查询: CSS 选择器
- beautifulsoup.select(css syntax)
# ##########################css 查询print(soup.select("title")) # 标签选择器
print(soup.select("#link1")) # id 选择器
print(soup.select(".sister")) # class 选择器
print(soup.select("p > a")) # 子类选择器
print(soup.select("p a")) # 包含选择器
print(soup.select("p, a, b")) # 群组选择器
print(soup.select("#link1 ~ .sister")) # 兄弟选择器
print(soup.select("#link1 + .sister")) # 兄弟选择器
print(soup.select("p[class='title']")) # 属性选择器
print(soup.select("a:nth-of-type(2)")) # 伪类选择器
转载于:https://www.cnblogs.com/wqunlong/p/10048832.html
【3】数据筛选3 - BeautifulSoup4相关推荐
- QIIME 2教程. 12数据筛选Filtering data(2021.2)
QIIME 2用户文档. 12数据筛选 Filtering data https://docs.qiime2.org/2021.2/tutorials/filtering/ 注:此实例需要完成本系列文 ...
- csvtk:命令行下表格统计分析、数据筛选、替换、整理神器
文章目录 安装 介绍 功能 使用 例子 猜你喜欢 写在后面 内容主要来自csvkt官方中文介绍 https://bioinf.shenwei.me/csvtk/chinese/.有改动,内容有增加 如 ...
- QIIME 2用户文档. 12数据筛选Filtering data(2019.7)
前情提要 NBT:QIIME 2可重复.交互和扩展的微生物组数据分析平台 1简介和安装Introduction&Install 2插件工作流程概述Workflow 3老司机上路指南Experi ...
- QIIME 2教程. 12数据筛选Filtering data(2020.11)
文章目录 QIIME 2用户文档. 12数据筛选 下载实验相关数据 过滤特征表 按数据量过滤 偶然因素的过滤 基于标识符的过滤 基于元数据的筛选 基于物种过滤表和序列 过滤序列 过滤距离矩阵 译者简介 ...
- QIIME 2用户文档. 11数据筛选Filtering data(2018.11)
文章目录 前情提要 QIIME 2用户文档. 11数据筛选 下载实验相关数据 过滤特征表 按数据量过滤 偶然因素的过滤 基于索引的过滤 基于元数据的筛选 基于物种过滤表和序列 过滤序列 过滤距离矩阵 ...
- R语言:数据筛选match
数据筛选是在分析中最常用的步骤,如微生物组分析中,你的OTU表.实验设计.物种注释之间都要不断筛选,来进行数据对齐,或局部分析. 今天来详解一下此函数的用法. match match:匹配两个向量,返 ...
- R语言对dataframe进行行数据筛选(row selection)多种方案:使用R原生方法、data.table、dplyr等方案
R语言对dataframe进行行数据筛选(row selection)多种方案:使用R原生方法.data.table.dplyr等方案 目录
- pandas数据预处理(字段筛选、query函数进行数据筛选、缺失值删除)、seaborn可视化分面图(facet)、seaborn使用Catplot可视化分面箱图(Faceted Boxplot)
pandas数据预处理(字段筛选.query函数进行数据筛选.缺失值删除).seaborn可视化分面图(facet).seaborn使用Catplot可视化分面箱图(Faceted Boxplot) ...
- R语言关联规则挖掘数据集预览、分析、筛选:项目数的分布形态(分位数、密度图)、itemFrequency函数统计每一项目在所有事务中出现的次数、最常发生的项目、数据筛选(交易的集合项目大于1)
R语言关联规则挖掘数据集预览.分析.筛选:项目数的分布形态(分位数.密度图).itemFrequency函数统计每一项目在所有事务中出现的次数.最常发生的项目.数据筛选(交易的集合项目大于1) 目录
最新文章
- ASP.NET中的页面指示标识
- 基于ESP32智能车竞赛比赛系统硬件初步调试-5-6
- python怎么变成竖行_python 处理文本 列变成行
- CentOS 6.3 下编译Nginx(笔记整理)
- java xmpp openfire_XMPP协议学习笔记三(Openfire服务器端搭建开发环境)
- Git添加为远程仓库
- 基于SpringBoot+mybatis+layui就业管理系统设计和实现
- 单例对象会被jvm的gc时回收吗_设计模式专题02-单例五种创建方式
- lombok原理_十分钟搞懂Lombok使用与原理
- 微软架构师谈编程语言发展
- PDF 开发者 Charles Geschke 去世,39 年前联合创立软件巨头 Adobe!
- jQuery-1.9.1源码分析系列(十) 事件系统——事件包装
- 端口冲突,可爱的8080
- Microled简介及关键工艺(巨量转移)
- 谷歌浏览器开发者工具network_关于Chrome谷歌浏览器开发者工具网络Network中返回无数据的问题...
- js实现夜空 干货比较多
- 实现微信公众号评论回复功能
- 剪辑视频的软件怎么二次剪辑才算原创
- python event对象
- LaTex科学论文写作
热门文章
- python3发布时间_什么时候python 3 才能有更好的支持呢?
- java接收参数_javaWeb收传参数方式总结
- mysql5.7.23主主重制_MySQL-23(主从复制)
- 外部仓库_一键同步!CODING 现已支持导入 GitHub 仓库
- mybatis一个方法执行多条sql_精尽MyBatis源码分析——SQL执行过程之Executor!
- web前端分享JavaScript到底是什么?特点有哪些?
- 经济师计算机考试取消,2019年经济师考试计算机机考答题要求及说明
- bp算法运行太慢_神经网络,BP算法的理解与推导
- html浮动跟随鼠标,jQuery 图片跟随鼠标浮动
- api postmain 鉴权_认证鉴权与API权限控制在微服务架构中的设计与实现(一)