#目录

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相关推荐

  1. QIIME 2教程. 12数据筛选Filtering data(2021.2)

    QIIME 2用户文档. 12数据筛选 Filtering data https://docs.qiime2.org/2021.2/tutorials/filtering/ 注:此实例需要完成本系列文 ...

  2. csvtk:命令行下表格统计分析、数据筛选、替换、整理神器

    文章目录 安装 介绍 功能 使用 例子 猜你喜欢 写在后面 内容主要来自csvkt官方中文介绍 https://bioinf.shenwei.me/csvtk/chinese/.有改动,内容有增加 如 ...

  3. QIIME 2用户文档. 12数据筛选Filtering data(2019.7)

    前情提要 NBT:QIIME 2可重复.交互和扩展的微生物组数据分析平台 1简介和安装Introduction&Install 2插件工作流程概述Workflow 3老司机上路指南Experi ...

  4. QIIME 2教程. 12数据筛选Filtering data(2020.11)

    文章目录 QIIME 2用户文档. 12数据筛选 下载实验相关数据 过滤特征表 按数据量过滤 偶然因素的过滤 基于标识符的过滤 基于元数据的筛选 基于物种过滤表和序列 过滤序列 过滤距离矩阵 译者简介 ...

  5. QIIME 2用户文档. 11数据筛选Filtering data(2018.11)

    文章目录 前情提要 QIIME 2用户文档. 11数据筛选 下载实验相关数据 过滤特征表 按数据量过滤 偶然因素的过滤 基于索引的过滤 基于元数据的筛选 基于物种过滤表和序列 过滤序列 过滤距离矩阵 ...

  6. R语言:数据筛选match

    数据筛选是在分析中最常用的步骤,如微生物组分析中,你的OTU表.实验设计.物种注释之间都要不断筛选,来进行数据对齐,或局部分析. 今天来详解一下此函数的用法. match match:匹配两个向量,返 ...

  7. R语言对dataframe进行行数据筛选(row selection)多种方案:使用R原生方法、data.table、dplyr等方案

    R语言对dataframe进行行数据筛选(row selection)多种方案:使用R原生方法.data.table.dplyr等方案 目录

  8. pandas数据预处理(字段筛选、query函数进行数据筛选、缺失值删除)、seaborn可视化分面图(facet)、seaborn使用Catplot可视化分面箱图(Faceted Boxplot)

    pandas数据预处理(字段筛选.query函数进行数据筛选.缺失值删除).seaborn可视化分面图(facet).seaborn使用Catplot可视化分面箱图(Faceted Boxplot) ...

  9. R语言关联规则挖掘数据集预览、分析、筛选:项目数的分布形态(分位数、密度图)、itemFrequency函数统计每一项目在所有事务中出现的次数、最常发生的项目、数据筛选(交易的集合项目大于1)

    R语言关联规则挖掘数据集预览.分析.筛选:项目数的分布形态(分位数.密度图).itemFrequency函数统计每一项目在所有事务中出现的次数.最常发生的项目.数据筛选(交易的集合项目大于1) 目录

最新文章

  1. ASP.NET中的页面指示标识
  2. 基于ESP32智能车竞赛比赛系统硬件初步调试-5-6
  3. python怎么变成竖行_python 处理文本 列变成行
  4. CentOS 6.3 下编译Nginx(笔记整理)
  5. java xmpp openfire_XMPP协议学习笔记三(Openfire服务器端搭建开发环境)
  6. Git添加为远程仓库
  7. 基于SpringBoot+mybatis+layui就业管理系统设计和实现
  8. 单例对象会被jvm的gc时回收吗_设计模式专题02-单例五种创建方式
  9. lombok原理_十分钟搞懂Lombok使用与原理
  10. 微软架构师谈编程语言发展
  11. PDF 开发者 Charles Geschke 去世,39 年前联合创立软件巨头 Adobe!
  12. jQuery-1.9.1源码分析系列(十) 事件系统——事件包装
  13. 端口冲突,可爱的8080
  14. Microled简介及关键工艺(巨量转移)
  15. 谷歌浏览器开发者工具network_关于Chrome谷歌浏览器开发者工具网络Network中返回无数据的问题...
  16. js实现夜空 干货比较多
  17. 实现微信公众号评论回复功能
  18. 剪辑视频的软件怎么二次剪辑才算原创
  19. python event对象
  20. LaTex科学论文写作

热门文章

  1. python3发布时间_什么时候python 3 才能有更好的支持呢?
  2. java接收参数_javaWeb收传参数方式总结
  3. mysql5.7.23主主重制_MySQL-23(主从复制)
  4. 外部仓库_一键同步!CODING 现已支持导入 GitHub 仓库
  5. mybatis一个方法执行多条sql_精尽MyBatis源码分析——SQL执行过程之Executor!
  6. web前端分享JavaScript到底是什么?特点有哪些?
  7. 经济师计算机考试取消,2019年经济师考试计算机机考答题要求及说明
  8. bp算法运行太慢_神经网络,BP算法的理解与推导
  9. html浮动跟随鼠标,jQuery 图片跟随鼠标浮动
  10. api postmain 鉴权_认证鉴权与API权限控制在微服务架构中的设计与实现(一)