BeautifuSoup4

from bs4 import BeautifulSoup

创建对象 <class 'bs4.BeautifulSoup'>

soup = BeautifulSoup(源码, '解析器')

bs4标签种类

(1)tag: 标签

print(soup.title, type(soup.title))

(2)获取标签里面的文本内容, 可导航的字符串,数据类型是<class 'bs4.element.NavigableString'>对象,可以使用字符串的方法

title = soup.title
# string
print(title.string, type(title.string))

(3)注释

# 注释 <class 'bs4.element.Comment'>
html = '<b><!--注释内容--></b>'
soup2 = BeautifulSoup(html, 'lxml')

遍历文档树

# 解析数据
head_tag = soup.p #默认获取第一个p标签
# 获取标签的子节点, .contents: 返回的是一个所有子节点的列表
# print(head_tag.contents)

print(head_tag.children)  # 返回的是一个生成器对象,通过循环遍历取值
for head in head_tag.children:
print(head)

源码:

# 1. 导入模块
from bs4 import BeautifulSoup# 源码
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>
"""# 2. 创建对象  <class 'bs4.BeautifulSoup'>
soup = BeautifulSoup(html_doc, 'lxml')

获取节点文本内容

.string

# 通过上一级标签,去获取子级的标签文本内容
# head = soup.head
# print(head.string)

.text

# print(head.text)  # 获取的是多个子级标签的文本内容,内容都拼接在一起

# strings/stripped_strings
contents = soup.html
# print(contents.string)  # 没有获取
# print(contents.text)

.strings


# print(contents.strings)  # <generator object Tag._all_strings at 0x000001E214912820> 生成器对象
# strings可以获取这个标签下的所有的文本,文本内容包含很多空行
# for data in contents.strings:
#     print(data)

.stripped_strings

# stripped_strings可以获取这个标签下的所有的文本,去除了多空行
# for data in contents.stripped_strings:
#     print(data)

总结:

获取标签文本内容
string: 标签里面只有一个标签有文本内容, 可导航的字符串,(使用 BeautifulSoup 解析文档后,标签(Tag)之间的文本会被转换为NavigableString对象,比如:<p>Hello, World!</p>,其中的"Hello, World!"就是一个NavigableString对象。它之所以被称为 "可导航",是因为他可以通过它访问周围的其他元素(如父标签、兄弟标签等),形成一个树形结构)
text: 将所有的标签文本内容拼接在一起
strings: 依次获取所有的标签文本内容,包含空行, 返回的是一个生成器对象
stripped_strings: 依次获取所有的标签文本内容,去除多余的空行看, 返回的是一个生成器对象

获取父节点

.parent

title_tag = soup.title
print(title_tag)  #<title>The Dormouse's story</title>
print(title_tag.parent)  #<head><title>The Dormouse's story</title></head>

.parents

# 一旦是获取的是多个标签内容,返回的就是生成器
a_tag = soup.a
print(a_tag.parents)   #<generator object PageElement.parents at 0x0000027F14C502E0>
for p in a_tag.parents:
print(p.name)
'''
p
body
html
[document]
'''

获取同级节点

源代码:

from bs4 import BeautifulSouphtml2 = """<a>
<b>bbbb</b><c>ccccc</c><d>dddd</d>
</a>"""soup = BeautifulSoup(html2, 'lxml')
b_tag = soup.c
# print(b_tag.next_sibling)  # 跟他相邻的下一个节点
# print(b_tag.next_siblings)  # 跟他相邻的下一个节点print(b_tag.previous_sibling)  # 上一个所有的兄弟节点
print(b_tag.previous_siblings)  # 上一个所有的兄弟节点

.next_sibling/.next_siblings

# print(b_tag.next_sibling)  # 跟他相邻的下一个节点
# print(b_tag.next_siblings)  # 跟他相邻的下一个所有节点

.previous_sibling)/.previous_siblings


print(b_tag.previous_sibling)  # 上一个所有的兄弟节点
print(b_tag.previous_siblings)  # 上一个所有的兄弟节点

方法使用(核心)

find(): 查找一个

# 获取a标签
a_tag = soup.find('a')  # 默认查找第一个标签
print(a_tag)


find_all():查找所有

a_tag_all = soup.find_all('a')
print(a_tag_all)  # 返回的是一个列表,用循环遍历

# 同时找两个标签,标签使用元组或列表使其成为一个整体,不能分开写
a_p_tag = soup.find_all(('title', 'b'))      #也可以写为:a_p_tag = soup.find_all(['title', 'b'])
print(a_p_tag)

案例:

# 导入模块
from bs4 import BeautifulSouphtml = """
<table class="tablelist" cellpadding="0" cellspacing="0"><tbody><tr class="h"><td class="l" width="374">职位名称</td><td>职位类别</td><td>人数</td><td>地点</td><td>发布时间</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=33824&keywords=python&tid=87&lid=2218">22989-金融云区块链高级研发工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-25</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=29938&keywords=python&tid=87&lid=2218">22989-金融云高级后台开发</a></td><td>技术类</td><td>2</td><td>深圳</td><td>2017-11-25</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=31236&keywords=python&tid=87&lid=2218">SNG16-腾讯音乐运营开发工程师(深圳)</a></td><td>技术类</td><td>2</td><td>深圳</td><td>2017-11-25</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=31235&keywords=python&tid=87&lid=2218">SNG16-腾讯音乐业务运维工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-25</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=34531&keywords=python&tid=87&lid=2218">TEG03-高级研发工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=34532&keywords=python&tid=87&lid=2218">TEG03-高级图像算法研发工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=31648&keywords=python&tid=87&lid=2218">TEG11-高级AI开发工程师(深圳)</a></td><td>技术类</td><td>4</td><td>深圳</td><td>2017-11-24</td></tr><tr class="odd"><td class="l square"><a target="_blank" href="position_detail.php?id=32218&keywords=python&tid=87&lid=2218">15851-后台开发工程师</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="even"><td class="l square"><a target="_blank" href="position_detail.php?id=32217&keywords=python&tid=87&lid=2218">15851-后台开发工程师</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr><tr class="odd"><td class="l square"><a id="test" class="test" target='_blank' href="position_detail.php?id=34511&keywords=python&tid=87&lid=2218">SNG11-高级业务运维工程师(深圳)</a></td><td>技术类</td><td>1</td><td>深圳</td><td>2017-11-24</td></tr></tbody>
</table>
<a href="https://www.baid.com">百度一下</a>
<a href="https://www.douban.com">豆瓣一下</a>
<a herf="https://www.python.com">python一下</a>
"""# 实例化一个对象
soup = BeautifulSoup(html, 'lxml')# 获取的是所有的tr标签
# trs = soup.find_all('tr')# 获取class="even"标签, bs4 class属性定位
# trs = soup.find_all('tr', class_="even")
# trs = soup.find_all('tr', attrs={"class": "even"})
# print(trs)
# <a id="test" class="test"
# a = soup.find_all('a', id="test", class_="test")
# find_all没有获取到数据,返回的是一个空列表
# trs = soup.find_all('a', attrs={"class": "test", "id":"test"})
# print(trs)# 获取所有a标签里面的href属性值
# a_lst = soup.find_all('a')
# for a in a_lst:
#     '''
#     get(): 属性不存在,返回的是一个none
#     对象['属性名']: 属性名 不存在,报错
#     '''
#     # href = a.get('href')
#     href = a['href']
#     print(href)# 获取职位名称
trs = soup.find_all('tr')[1:]
for tr in trs:# print(tr)a = tr.find('a')print(a.string)

获取class="even"标签, bs4 class属性定位

# trs = soup.find_all('tr', class_="even")
# trs = soup.find_all('tr', attrs={"class": "even"})
# print(trs)

通过id和属性定位

# <a id="test" class="test"
# a = soup.find_all('a', id="test", class_="test")
# find_all没有获取到数据,返回的是一个空列表
# trs = soup.find_all('a', attrs={"class": "test", "id":"test"})
# print(trs)

获取所有a标签里面的href属性值

get(): 属性不存在,返回的是一个none
对象['属性名']: 属性名 不存在,报错

# a_lst = soup.find_all('a')
# for a in a_lst:
#     '''
#     get(): 属性不存在,返回的是一个none
#     对象['属性名']: 属性名 不存在,报错
#     '''
#     # href = a.get('href')
#     href = a['href']
#     print(href)

# 获取职位名称
trs = soup.find_all('tr')[1:]
for tr in trs:
# print(tr)
a = tr.find('a')
print(a.string)

Css选择器

select:查找标签,默认查找所有,并且返回的数据类型list

print(soup.select('a'))   #查找所以的a标签

定位class='sister'的标签,使用.sister     .属性值

print(soup.select('.sister'))

定位id="link1"的标签,使用#link1

print(soup.select('#link1'))

定位p标签并且id值为link1,使用p#link1

print(soup.select('p#link1'))

获取的title标签下的文本信息,select: 只有一个元素,返回的数据类型还是列表

print(soup.select('title')[0].string)
print(soup.select('title')[0].text)
print(list(soup.select('title')[0].strings))
print(list(soup.select('title')[0].stripped_strings))

p a: 选择所有位于<p>元素内a元素,无论嵌套了多少层,都能找到

print(soup.select('p a'))

p>a: 选择所有作为<p>直接的子元素标签

print(soup.select('p>a'))

<p class="story">Once upon a time there were three little sisters; and their names were<span><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>,<a href="sister">余承东</a>;and they lived at the bottom of a well.</span>
</p>

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/web/88378.shtml
繁体地址,请注明出处:http://hk.pswp.cn/web/88378.shtml
英文地址,请注明出处:http://en.pswp.cn/web/88378.shtml

如若内容造成侵权/违法违规/事实不符,请联系英文站点网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

CPP中的List

一.list的介绍&#xff1a;1.list是可以在常数范围内在任意位置进行插入和删除的序列式容器&#xff0c;并且该容器可以前后双向迭代。2.list的底层是双向链表结构&#xff0c;带有哨兵位的头结点 。3. list与forward_list非常相似&#xff1a;最主要的不同在于forward_list是单…

Ntfs!LfsUpdateLfcbFromRestart函数分析之Ntfs!LfsFindOldestClientLsn

第0部分&#xff1a;//// Find the oldest client Lsn. Use the last flushed Lsn as a starting point.//Lfcb->OldestLsn Lfcb->LastFlushedLsn;LfsFindOldestClientLsn( RestartArea,Add2Ptr( RestartArea, Lfcb->ClientArrayOffset, PLFS_CLIENT_RECORD ),&…

「日拱一码」021 机器学习——特征工程

目录 特征选择 过滤法&#xff08;Filter Methods&#xff09; 方差选择法 相关系数法 卡方检验 包裹法&#xff08;Wrapper Methods&#xff09; 递归特征消除&#xff08;RFE&#xff09; 嵌入法&#xff08;Embedded Methods&#xff09; L1正则化&#xff08;Lasso…

k8s:安装 Helm 私有仓库ChartMuseum、helm-push插件并上传、安装Zookeeper

ChartMuseum 是 Kubernetes 生态中用于存储、管理和发布 Helm Charts 的开源系统&#xff0c;主要用于扩展 Helm 包管理器的功能 核心功能 ‌集中存储‌&#xff1a;提供中央化仓库存储Charts&#xff0c;支持版本管理和权限控制。 ‌ ‌跨集群部署‌&#xff1a;支持多集群环境…

C++编程学习(第二天)

1、求a和b两个数之和。#include <iostream> using namespace std;int main() {int a, b, sum; //定义变量a、b、sumcout << "请输入第一个数字a: "; //打印需要显示的字符串cin >> a; // >&…

毫米波雷达守护银发安全:七彩喜跌倒检测仪重构居家养老防线

在老龄化加速与独居老人数量攀升的背景下&#xff0c;跌倒已成为威胁老年人生命安全的“隐形杀手”。七彩喜跌倒检测仪以毫米波雷达技术为核心&#xff0c;通过“非接触式监测智能预警”重塑居家安全防护体系&#xff0c;为银发群体构建起全天候、无感化的数字守护网。技术突破…

面试复盘:节流中第二次触发的事件?答错补课

面试复盘&#xff1a;节流中第二次触发的事件&#xff1f;答错补课 背景描述 今天面试时被问到一个看似基础但暗藏玄机的问题&#xff1a;“节流&#xff08;Throttle&#xff09;函数中&#xff0c;第二次触发的那一帧事件是否会被丢掉&#xff1f;” 我基于对经典节流实现的…

Spark伪分布式集群搭建(Ubuntu系统)

环境准备 系统要求&#xff1a;Ubuntu 20.04/22.04 LTS 软件版本&#xff1a; Hadoop 3.3.5 JDK 8 Spark-3.5.6-bin-hadoop3 硬件要求&#xff1a;至少4GB内存&#xff0c;20GB磁盘空间 以下是基于Ubuntu系统的Spark伪分布式集群搭建全流程。以Spark 3.5.6 Hadoop 3.3.…

【快手】数据挖掘面试题0001:查找连续三天登录的用户

文章大纲一、测试数据构建二、自连接方案三、窗口函数方案一张用户表&#xff0c;uer_id&#xff0c;signin_date&#xff0c;大概是这么几项&#xff0c;查找连续三天登录的用户。 比如说&#xff0c;1,2两天登录不是连续三天&#xff0c;456登录为连续三天登录&#xff0c;56…

简说scp命令

简单介绍 scp的全称是&#xff1a;Secure Copy Protocol&#xff08;安全复制协议&#xff09;&#xff0c;是Linux中用于在网络中安全传输文件的命令行工具。它基于SSH协议&#xff0c;用于在本地服务器和远程服务器之间&#xff0c;或者两台远程服务器之间复制文件或目录。 s…

自动化测试解决方案Parasoft SOAtest无脚本UI测试实践指南

传统UI自动化测试常面临技术门槛高、维护成本大、稳定性差等挑战。尤其在页面频繁变更时&#xff0c;测试脚本的更新和维护会显著降低测试效率。 自动化测试解决方案Parasoft SOAtest通过可视化操作和智能元素定位技术&#xff0c;无需编写代码&#xff0c;让测试人员能够像真…

vscode配置头文件和编译器

在 VS Code 中配置编译器和头文件路径需要修改两个核心文件&#xff1a;c_cpp_properties.json&#xff08;用于智能提示&#xff09;和 tasks.json&#xff08;用于构建&#xff09;。以下是详细步骤&#xff1a; —### 1. 配置智能提示和头文件路径 (c_cpp_properties.json)作…

HTML+JS+CSS制作一个数独游戏

闲来无事&#xff0c;用HTMLJSCSS制作了一个数独游戏消遣。其实主要是自己做题的时候用笔画删除数字太容易出错&#xff0c;所以想搞一个程序稍微辅助一下。通过制作这个程序&#xff0c;反而提高了手工做题的水平&#xff0c;至少学会了记录步数以便于回退。 20250710功能更新…

嵌入式硬件中电容的基本原理与实现详解02

我们今天重点讨论点知识点如下: 1.各种种类的电容优缺点对比讲解 2.电容的标称值介绍 3.电容的单位介绍 4.常见的电压信号有哪些? 5. 电容的耐压值讲解 6.电容的容值有哪些? 7.12pF、15pF 电容常用在什么场合? 8. 振荡电路中使用的电容常常需要使用什么材质的电容? 9.100n…

Python训练打卡DAY46

DAY46&#xff1a;通道注意力&#xff08;SE注意力&#xff09; 恩师浙大疏锦行 知识点&#xff1a; 不同CNN层的特征图&#xff1a;不同通道的特征图什么是注意力&#xff1a;注意力家族&#xff0c;类似于动物园&#xff0c;都是不同的模块&#xff0c;好不好试了才知道。通…

fastadmin_php专项

1.时间的判断,还有就是在php这边如何去拿前端html元素上面的值input($row.borrowtime);// 创建两个 DateTime 对象$row_expecttime new \DateTime(input($row.borrowtime));$par_expecttime new \DateTime( $params[expecttime]); // // 计算两个日期之间的差异 // …

如何在MySQL中选择使用InnoDB还是MyISAM引擎?

在 MySQL 中选择 InnoDB 还是 MyISAM 存储引擎时&#xff0c;需根据应用场景的需求权衡功能、性能和数据完整性。以下是具体的选择指南&#xff1a; 1. 优先考虑事务和外键需求必须使用 InnoDB&#xff1a; 若应用需要 事务支持&#xff08;如金融转账、订单处理&#xff09;或…

邀请函 | 知从科技邀您共赴2025 RISC-V 中国峰会

第五届RISC-V中国峰会将于2025年7月16至19日在上海张江科学会堂隆重举办&#xff0c;本届峰会由上海开放处理器产业创新中心&#xff08;SOPIC&#xff09;主办&#xff0c;RISC-V国际开源实验室&#xff08;RIOS实验室&#xff09;和上海张江高科技园区开发股份有限公司联合主…

企业数字化转型规划和建设方案(管理架构、应用架构、技术架构)PPT

一、战略定位与核心目标以 “技术赋能业务&#xff0c;数据驱动创新” 为核心思路&#xff0c;构建 “三步走” 战略演进路径&#xff0c;实现 IT 从 “基础支撑” 到 “战略引擎” 的升级&#xff1a;IT1.0&#xff08;1-2 年&#xff09;&#xff1a;夯实基础能力定位 “稳健…

基于Uniapp+MySQL+PHP的景区多商户小程序源码系统 带完整的搭建指南

温馨提示&#xff1a;文末有资源获取方式该系统采用 PHP MySQL 的经典开发组合。PHP 作为一种广泛使用的开源脚本语言&#xff0c;具有简单易学、运行速度快、跨平台性强等优点&#xff0c;能够快速开发出功能强大的 Web 应用程序。MySQL 则是一款稳定可靠的关系型数据库管理系…