2.5 BeautifulSoup使用 CSS 语法查找元素

news/2024/4/20 18:21:26/文章来源:https://blog.csdn.net/qq_57268251/article/details/129171504

1. 使用 CSS 语法


BeautifulSoup 除了可以使用 find 与 find_all 函数查找 HTML 文档树的结点元素外,还可以采用 CSS 类似的语法来查询,

规则是:tag.select(css)
  • tag 是一个bs4.element.Tag对象,即 HTML 中的一个 element 结点元素;

  • select 是它的查找方法;

  • css 是类似 CSS 语法的一个字符串

其一般结构如下:

[tagName][attName[=value]]
  • 其中[...]部分是可选的

  • tagName 是元素名称,如果没有指定就是所有元素

  • attName=value 是属性名称,value是它的对应的值,可以不指定属性,在指定了属性后也可以不指定值

  • tag.select(css) 返回一个 bs4.element.Tag 的列表,他怕只有一个元素也是一个列表

例:

soup.select("a") 查找文档中所有<a>元素结点(必须是双引);
soup.select("p a") 查找文档中所有<p>结点的所有<a>元素结点;
soup.select("p[class='story'] a") 查找文档中所有属性class="story"的<p>结点下的所有<a>元素结点;
soup.select("p[class] a") 查找文档中所有具有class属性的<p>节点下的所有<a>元素节点;
soup.select("a[id='link1']") 查找属性id="link1"的<a>节点;
soup.select("body head title") 查找<body>下面<head>下面的<title>节点;
soup.select("body [class] ") 查找<body>下面所有具有class属性的节点;
soup.select("body [class] a") 查找<body>下面所有具有class属性的节点下面的<a>节点。
frombs4importBeautifulSoup
​
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="https://example.com/elsie" class="sister" id="link1">Elsie</a>,
<a href="https://example.com/lacie" class="sister" id="link2">Lacie</a> and
<a href="https://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>
'''
# 查找HTML文档中所有<p>下面的<a>的链接
soup=BeautifulSoup(doc, "lxml")
tags=soup.select("p[class='story'] a")  # CSS 语法字符串能够较好把标签的层次结构进行简单多样的表达
# 另外我们通过
# tags=soup.select("p a")
# tags=soup.select("a")
# tags=soup.select("p[class] a") # 等也可以得到一样的结果。
​
fortagintags:print(tag["href"])# https://example.com/elsie# https://example.com/lacie# https://example.com/tillie
​

2. 属性的语法规则


在CSS结构中的 [attName=value] 表示属性attrName与value相等,也可以指定不等包含等运算关系,

具体运算如下表:

选择器

描述

[attName]

用于选取带有指定属性的元素。

[attName=value]

用于选取带有指定属性和值的元素。

[attName^=value]

匹配属性值以指定值开头的每个元素。

[attName$=value]

匹配属性值以指定值结尾的每个元素。

[attrName*=value]

匹配属性值中包含指定值的每个元素。

因此:

  • soup.select("a[href='http://example.com/elsie']") 查找href="http://example.com/elsie"的<a>节点;

  • soup.select("a[href$='sie']") 查找href以"sie"结尾的<a>节点;

  • soup.select("a[href^='http://example.com']") 查找href以"http://example.com"开始的<a>节点;

  • soup.select("a[href*='example']") 查找href的值中包含"example"字符串的<a>节点。

3. Select 查找子孙结点


在select(css)中的css有多个节点时,节点元素之间用空格分开,就是查找子孙节点,例如soup.select("div p")是查找所有<div>节点下面的所有子孙<p>节点。

frombs4importBeautifulSoup
​
doc="""<div><p>A</p><span><p>B</p></span></div><div><p>C</p></div>"""
​
# 查找子孙结点
soup=BeautifulSoup(doc, "lxml")
tags=soup.select("div p")
fortagintags:print(tag)# <p>A</p># <p>B</p># <p>C</p>
​

4. Select 查找直接子结点


在select(css)中的css有多个节点时,节点元素之间用" > "分开(注意 > 的前后至少包含一个空格),就是查找直接子节点,例如soup.select("div > p")是查找所有<div>节点下面的所有直接子节点<p>,不包含孙节点

frombs4importBeautifulSoup
​
doc="""<div><p>A</p><span><p>B</p></span></div><div><p>C</p></div>"""
soup=BeautifulSoup(doc, "lxml")
tags=soup.select("div > p")
fortagintags:print(tag)# <p>A</p># <p>C</p>
​

5. Select 查找兄弟结点


在select中用" ~ "连接两个节点表示查找前一个节点后面的所有同级别的兄弟节点注意 ~ 号前后至少有一个空格),例如soup.select("div ~ p")查找<div>后面的所有同级别的<p>兄弟节点。

在select中用" + "连接两个节点表示查找前一个节点后面的第一个同级别的兄弟节点注意 + 号前后至少有一个空格)

frombs4importBeautifulSoup
​
doc="""<body>demo<div>A</div><b>X</b><p>B</p><span><p>C</p></span><p>D</p></div></body>"""
​
# 查找兄弟结点
soup=BeautifulSoup(doc, "lxml")
# print(soup.prettify())  # 修复后HTML文档树——去掉12行</div>
tags=soup.select("div ~ p")
fortagintags:print(tag)# <p>B</p># <p>D</p>
print()
tags=soup.select("div + p")
fortagintags:print(tag)  # 没找到匹配结果
​

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

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

相关文章

Word中批量调整图片大小

当一个文档中图片较多&#xff0c;又需要调整图片大小时&#xff0c;这时可以通过“宏”执行代码来批量调整。打开一个Word文档。“AltF8"键打开宏。设置“宏名”&#xff0c;并单击“创建”。创建完宏后&#xff0c;将进入Visual Basic 编辑器界面。在代码编辑区全选&…

【面试题】TCP如何保证传输可靠性?TCP流量控制实现、拥塞控制、ARQ协议、停止等待ARQ、连续ARQ

文章目录1. TCP 如何保证传输的可靠性&#xff1f;2.TCP 如何实现流量控制&#xff1f;3.TCP 的拥塞控制是怎么实现的&#xff1f;3.ARQ 协议了解吗?4.停止等待 ARQ 协议5.连续 ARQ 协议1. TCP 如何保证传输的可靠性&#xff1f; 基于数据块传输 &#xff1a;应用数据被分割成…

前端编译、JIT编译、AOT编译

一、前端编译&#xff1a;java设计之初就是强调跨平台&#xff0c;通过javac将源文件编译成于平台无关的class文件&#xff0c; 它定义了执行 Java 程序所需的所有信息&#xff08;许多Java"语法糖"&#xff0c;是在这个阶段完成的&#xff0c;不依赖虚拟机&#xff…

01-MySQL基础-简介安装navicat使用SQL(DDL、DML、(DCL)、DML)

文章目录MySQL基础1&#xff0c;数据库相关概念1.1 数据库1.2 数据库管理系统1.3 常见的数据库管理系统1.4 SQL2&#xff0c;MySQL2.1~2.4 mysql安装2.5 MySQL数据模型3&#xff0c;SQL概述3.1 SQL简介3.2 通用语法3.3 SQL分类4&#xff0c;DDL:操作数据库4.1 查询4.2 创建数据…

Java笔记026-集合/数组、Collection接口、ArrayList、Vector、LinkedList

集合集合的理解和好处保存多个数据使用的是数组&#xff0c;分析数组的弊端数组1、长度开始必须指定&#xff0c;而且一旦指定&#xff0c;不能更改2、保存的必须为同一类型的元素3、使用数组进行增加/删除元素的示意代码-比较麻烦Person数组扩容示意代码Person[] pers new Pe…

手把手搭建springboot项目05-springboot整合Redis及其业务场景

目录前言一、食用步骤1.1 安装步骤1.1.1 客户端安装1.2 添加依赖1.3 修改配置1.4 项目使用1.5 序列化二、应用场景2.1 缓存2.2.分布式锁2.2.1 redis实现2.2.2 使用Redisson 作为分布式锁2.3 全局ID、计数器、限流2.4 购物车2.5 消息队列 (List)2.6 点赞、签到、打卡 (Set)2.7 筛…

Liunx服务器安装SVN

一、下载svn安装包链接&#xff1a;https://pan.baidu.com/s/1gkS0tef2kQP6nvXOS64hUw 提取码&#xff1a;cyuw二、SVN安装部署通过sftp将文件拉取到目的主机路径&#xff1a;/usr/package 跳转文件路径: cd /usr/package 执行解压命令:tar -zxvf subversion-1.14.2.tar.gz 执行…

idea启动报错If you already have a 64-bit JDK installed, define a JAVA HOME variable

IDEA启动报错&#xff0c;如下图所示&#xff1a; 解决方法&#xff1a; 1.根据以下路径找到文件idea64.exe.vmoptions &#xff0c;路径如下图所示&#xff1a; C:\Users\Thinkpad\AppData\Roaming\JetBrains\IntelliJIdea2020.3\idea64.exe.vmoptions 其中Thinkpad是电脑的…

j-vxe-table 下拉搜索选择框数据加载过多导致前端崩溃问题

Jeeg-boot j-vxe-table 下拉搜索选择框数据加载过多导致前端崩溃问题 最近用到了Jeeg-boot j-vxe-table的组件&#xff0c;这组件时真J8难用&#xff0c;还好多BUG&#xff0c;想用个slot插槽也用不了&#xff0c;好像官方写了个基础就没怎么管了。&#x1f611; 问题&#xf…

JavaEE-初识Servlet

目录Servlet 是什么?完成一个servlet程序1.创建一个maven项目2.引入依赖3.创建目录4.编写Servlet代码5.打包6.部署7.验证程序第三方工具简化Servlet 是什么? Servlet 是一种实现动态页面的技术. 是一组 Tomcat 提供给程序猿的 API, 帮助程序猿简单高效的开发一个 web app. …

阅读笔记7——Focal Loss

一、提出背景 当前一阶的物体检测算法&#xff0c;如SSD和YOLO等虽然实现了实时的速度&#xff0c;但精度始终无法与两阶的Faster RCNN相比。是什么阻碍了一阶算法的高精度呢&#xff1f;何凯明等人将其归咎于正、负样本的不平衡&#xff0c;并基于此提出了新的损失函数Focal L…

支持向量机SVM详细原理,Libsvm工具箱详解,svm参数说明,svm应用实例,神经网络1000案例之15

目录 支持向量机SVM的详细原理 SVM的定义 SVM理论 Libsvm工具箱详解 简介 参数说明 易错及常见问题 SVM应用实例&#xff0c;基于SVM的股票价格预测 支持向量机SVM的详细原理 SVM的定义 支持向量机&#xff08;support vector machines, SVM&#xff09;是一种二分类模型&a…

Linux文件系统操作与磁盘管理

查看磁盘和目录的容量 使用 df 命令查看磁盘的容量 df在实验楼的环境中你将看到如下的输出内容&#xff1a; 但在实际的物理主机上会更像这样&#xff1a; 物理主机上的 /dev/sda2 是对应着主机硬盘的分区&#xff0c;后面的数字表示分区号&#xff0c;数字前面的字母 a 表示…

《JeecgBoot系列》 如何设计表单实现“下拉组件二级联动“ ? 以省市二级联动为例

《JeecgBoot系列》 如何设计表单实现"下拉组件二级联动" ? 以省市二级联动为例 一、准备字典表 1.1 创建字典表 CREATE TABLE sys_link_table ( id int NULL, pid int NULL, name varchar(64) null );1.2 准备数据 idpidname1全国21浙江省32杭州市42宁波市51江苏…

投出1000份简历,苦于软件测试没有项目经验,全部石沉大海,辞职5个月,我失业了......

想要找一份高薪的软件测试工作&#xff0c;简历项目必不可少&#xff08;即使是应届生&#xff0c;你也要写上实习项目&#xff09;。所以很多自学的朋友找工作时会碰到一个令人颇感绝望的拦路虎&#xff1a;个人并没有实际的项目工作经验怎么办&#xff1f; 怎么办&#xff1f…

Kotlin新手教程九(协程)

一、协程 协程从Kotlin1.3开始引入&#xff0c;本质上协程就是轻量级的线程。协程的基本功能点有&#xff1a; 轻量&#xff1a;可以在单个线程上运行多个协程&#xff0c;因为协程支持挂起&#xff0c;不会使正在运行协程的线程阻塞。挂起比阻塞节省内存&#xff0c;且支持多…

python -- 魔术方法

魔术方法就算定义在类里面的一些特殊的方法 特点&#xff1a;这些func的名字前面都有两个下划线 __new__方法 相当于一个类的创建一个对象的过程 __init__方法 相当于为这个类创建好的对象分配地址初始化的过程 __del__方法 一个类声明这个方法后&#xff0c;创建的对象如果…

缺少IT人员的服装行业该如何进行数字化转型?

服装行业上、下游产业链长&#xff0c;产品属性复杂&#xff0c;是劳动密集型和技术密集型紧密结合的产物&#xff0c;是典型的实体经济代表。 近二十年是服装业发展的机遇和挑战之年&#xff0c;从“世界工厂”“中国制造”&#xff0c;逐渐向“中国设计”转变,中国服装产业经…

c++常用stl算法

1、头文件 这些算法通常包含在头文件<algorithm> <functional> <numeric>中。 2、常用遍历算法 for_each(v.begin(),v.end(), 元素处理函数/仿函数) 注意&#xff1a;在使用transform转存时&#xff0c;目标容器需要提取开辟合适的空间。 void printfunc(…

数学小课堂:数学的线索(从猜想到定理再到应用的整个过程)

文章目录 引言I 勾股定理1.1 勾三股四弦五1.2 数学和自然科学的三个本质差别1.3 总结引言 从猜想到定理再到应用的整个过程是数学发展和体系构建常常经历的步骤。 I 勾股定理 勾股定理: 直角三角形两条直角边的平方之和等于斜边的平方,这个定理在国外都被称为毕达哥拉斯定理…