【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 = """
The Dormouse's story
The Dormouse's story
Once upon a time there were three little sisters; and their names were
Elsie,
Lacie and
Tillie;
and they lived at the bottom of a well.
...
"""
from bs4 import BeautifulSoup
# 构建 bs4 文档对象
soup = BeautifulSoup(html_doc, 'lxml')
print(type(soup)) #
```
#5.节点查询: 子节点
```
# 节点名称查询
print(soup.title) # The Dormouse's story
print(soup.p) #
The Dormouse's story
print(soup.a) # Elsie
# 子节点查询
chs = soup.contents
print(type(chs), len(chs)) # 2
chs2 = soup.children
print(type(chs2), len(list(chs2))) # 2
# 包含节点查询
chs3 = soup.descendants
print(type(chs3), len(list(chs3))) # 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) #
# 获取包含的所有文本数据,剔除空白字符
print(soup.body.stripped_strings) #
```
#6.节点查询:父节点
```
# ##########################父节点查询
print(soup.a) # Elsie
查询直接父节点
print(soup.a.parent.name) # p
遍历查询所有父节点
print([tag.name for tag in soup.a.parents]) # ['p', 'body', 'html', '[document]']
<br>
#7.节点查询: 兄弟节点
##########################兄弟节点
获取当前节点
print(soup.a) # Elsie
获取前一个兄弟节点:得到文本节点
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>
<br>
#8.节点查询:解析顺序
BeautifulSoup4 提供了一种比较特殊的操作:按照文档的解析顺序进行节点的查询,解析顺序和浏览器解释 HTML 文档的顺序是一致的
#########################解析顺序节点
获取当前节点
print(soup.a) # Elsie
获取前一个兄弟节点:得到文本节点
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']
<br>
#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()
<br>
#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)")) # 伪类选择器
【3】数据筛选3 - BeautifulSoup4的更多相关文章
- ASP.NET MVC5+EF6+EasyUI 后台管理系统(81)-数据筛选(万能查询)
系列目录 前言 听标题的名字似乎是一个非常牛X复杂的功能,但是实际上它确实是非常复杂的,我们本节将演示如何实现对数据,进行组合查询(数据筛选) 我们都知道Excel中是如何筛选数据的.就像下面一样 他 ...
- DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样
'近日有本论坛网友问:DataGridView如何实现列标头带数据筛选功能,就象Excel高级筛选功能一样 '今晚正好闲着没事,加之以前也没用到过这个需求,所以就写了个模拟功能,供各位坛友酌情参考. ...
- layui table 根据条件改变更换表格颜色 高亮显示 数据筛选
请问想让当layui表格的某个字段符合某个条件的时候,让该行变颜色.这样可以实现么. layui数据表格怎么更换表格颜色 layui表格 通过判断某一行中的某一列的值进行设置这一行的颜色 LayUI之 ...
- C#进行数据筛选(二)
这里介绍LINQ+Lambda表达式进行数据筛选的方式 这里是第一种方式,还是使用了if条件语句去判断,根据选择的条件去筛选出我所需要的数据 public GxAnaly SelectDay(stri ...
- C#进行数据筛选(一)
这里介绍数据筛选的第一种方式,不用过滤器,给新手看得 public DataTable SourceList(string Wmain, string OrderNo, string Process) ...
- python之pandas数据筛选和csv操作
本博主要总结DaraFrame数据筛选方法(loc,iloc,ix,at,iat),并以操作csv文件为例进行说明 1. 数据筛选 a b c (1)单条件筛选 df[df[] # 如果想筛选a列的取 ...
- Pandas 数据筛选,去重结合group by
Pandas 数据筛选,去重结合group by 需求 今小伙伴有一个Excel表, 是部门里的小伙9月份打卡记录, 关键字段如下: 姓名, 工号, 日期, 打卡方式, 时间, 详细位置, IP地址. ...
- 【杂记】mysql 左右连接查询中的NULL的数据筛选问题,查询NULL设置默认值,DATE_FORMAT函数
MySQL左右连接查询中的NULL的数据筛选问题 xpression 为 Null,则 IsNull 将返回 True:否则 IsNull 将返回 False. 如果 expression 由多个变量 ...
- 4-Pandas之数据类型与数据筛选
一.数据类型 1.Pandas的数据类型主要结合了pandas和numpy两个模块中的数据类型,包括以下几种: float int bool datetime64[ns]------>日期类型 ...
随机推荐
- bzoj 1370 Gang团伙
题目大意: 在某城市里住着n个人,任何两个认识的人不是朋友就是敌人,满足 1. 我朋友的朋友是我的朋友 2. 我敌人的敌人是我的朋友 所有是朋友的人组成一个团伙 告诉你关于这n个人的m条信息,即某两个 ...
- tomcat调优配置
今天遇到一个tomcat服务注册后配置Java参数没效果,最后在注册表中删除原来的tomcat服务后,顺便看了一下tomcat的调优配置,看别人总结的不错,就转载一下. Tomcat.Jetty.Gl ...
- [Advance] How to debug a program (上)
Tool GDB Examining Memory (data or in machine instructions) You can use the command x (for “examine” ...
- bzoj1047
二维单调队列 rmq很明显会超时,如果这个序列是一维的,很明显就是个单调队列,现在就是把一维的单调队列转换为二维单调队列. 先求出每一列的窗口极值,然后对于每一行做单调队列,值就是之前求出每个位置结尾 ...
- IE6的3像素BUG产生条件及解决方法
1.IE6中第一个元素浮动第二个元素不浮动,这两个元素之间就会产生3像素BUG 2.解决方案: 2.1若若宽度一定则给第二个元素添加 float 样式即可: 2.2若宽度自适应: 2.2.1 _ma ...
- Java源码——Integer
最近在研究java的源代码,但是由于自己英语水平有限,所以想使用中文注释的方式把源码里的方法全部重写 一遍,下面是楼主整理出来的一小部分.我把整体的项目托管到GitHub上了,欢迎大家前去交流学习. ...
- CodeForces 446A DZY Loves Sequences (DP+暴力)
题意:给定一个序列,让你找出一个最长的序列,使得最多改其中的一个数,使其变成严格上升序列. 析:f[i] 表示以 i 结尾的最长上升长度,g[i] 表示以 i 为开始的最长上升长度,这两个很容易就求得 ...
- bzoj 1666: [Usaco2006 Oct]Another Cow Number Game 奶牛的数字游戏【模拟】
模拟 #include<iostream> #include<cstdio> using namespace std; int n,ans; int main() { scan ...
- ROS-USB摄像头
前言:演示使用usb摄像头功能,推荐使用方法二. 首先要有一个usb摄像头,本次使用的是罗技(Logitech)摄像头. 一.使用软件库里的uvc-camera功能包 1.1 检查摄像头 lsusb ...
- 附加数据库错误代码 - 950【MSSQL】
分析 (539)代表的是Sql Server 2000数据库的内部版本号,也就是说要附加的数据库文件是由Sql Server 2000创建的,但是我们知道Sql Server 2016 数据库是不兼容 ...