【爬虫】2.5 BeautifulSoup使用 CSS 语法查找元素

2023-05-16

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)  # 没找到匹配结果
​

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

【爬虫】2.5 BeautifulSoup使用 CSS 语法查找元素 的相关文章

  • 是否有针对 CSS 位置和可点击区域的 Android 浏览器错误的解决方法?

    当您有一些可点击的内容时 例如 a a
  • 在 IE 8 及以下版本中动态添加 @font-face 规则

    我使用 IE stylesheet addRule 方法添加 font face 规则 但是 符号对于该方法的 选择器 参数来说是不允许的字符 因此我收到 无效参数 错误 s addrule font face font family Fo
  • html 和 body 元素的高度

    我一直在互联网上查找 min height 和 height 属性如何在 body 和 html 元素上工作 我在很多地方都看到过下面的代码 html height 100 body min height 100 上面的内容可以与其他一些
  • IE7 显示问题:菜单中的表格

    我写了一个菜单样式 在 IE8 FF3 6 GC7 中运行良好 现在的问题是 我的老板希望它甚至可以在 IE7 上运行 我真的很努力地让它在 IE7 上运行 但无法获得相同的外观 menu css a outline none menu m
  • Flexbox 不适用于 iPad 和 Safari [重复]

    这个问题在这里已经有答案了 我在网站上使用 Flexbox 但它在 iPad Air iPad 3 和 Safari PC 上崩溃 设计和代码与此 codepen 类似 http codepen io anon pen xwJzEg htt
  • 每 3 秒重复一次动画

    我正在使用 WOW js 和 animate css 现在我正在将 CSS 运行到 Infinite 我想知道如何让我的课程运行 3 秒停止并再次开始到无限 My html img src images fork png class for
  • 如何重置使用 JavaScript 更改的 CSS 属性?

    我的导航按钮的宽度从 100px 增加到 150px 当鼠标悬停在 nav li hover width 150px 但是使用 javascript 我已经做到了 无论选择哪个选项 宽度都将继续为 150px 当选择每个选项时 它会使其他选
  • 保持未知数量的 div 居中,每行最多 4 个

    我有一个简单的问题 但我自己无法解决 简而言之 有一个未知电话我必须在页面中放置的元素数量 最多 每行 4 个元素 但仍居中 此图片给您一个提示 我为了示例而设置它 详细 在上图中我涵盖了不同的场景 例如 如果总共有 5 个元素 则应使用第
  • 如何仅在最后一个
  • 处给出透明六边形角度?
  • 我必须制作这样的菜单 替代文本 http shup com Shup 330421 1104422739 My Desktop png http shup com Shup 330421 1104422739 My Desktop png
  • 为什么元素上的负底部边距会降低该元素父元素的高度?

    这可能是由于边距折叠造成的 我知道边距折叠 至少知道它如何影响相邻元素 但我不明白当涉及负边距时它如何在嵌套元素上工作 例如 在此标记和随附的 CSS 中 Markup div class parent div class child Ch
  • 使用 Java 清理 CSS

    Java 中有没有一个好的库可以清理 CSS 样式表 我们希望允许管理员用户上传 CSS 样式表来控制他们管理的网站部分的外观 当然 我们不希望出现诸如background url javascript 之类的XSS攻击 因此我们正在寻找一
  • CSS3、WebKit 过渡顺序?如何排队等候转场?

    我有以下内容 webkit transition property top bottom z index webkit transition duration 0 5s 问题是我不希望 z index 在顶部和底部完成之前转换 有没有办法告
  • 背景突出显示代码块中的文本?

    我的目标是能够显示如下内容 我想要背景突出显示已经有的代码块内的一段代码语法高亮 我想在 Github 上托管于 Github Pages 上的 Markdown 文件上执行此操作 可以使用 kramdown markdown html c
  • 如何将div对齐到页面底部,而不是屏幕底部

    我想将 div 与页面底部对齐 而不是与屏幕底部对齐 当我这样做时 contact block position absolute bottom 0 left 0 div 被放置在屏幕的底部区域 当我的页面很长时 我必须向下滚动 并且本应位
  • jQuery 更改事件未在输入元素上触发

    首先 我检查了与我的问题类似的每个主题 不幸的是 我还没有找到答案 我尝试结合一些答案 但没有成功 注 刚开始学习jQuery 所以这是我的问题 我创建了一个带有四个文本输入和一个按钮的表单 每个输入内部都有一个 svg 图标和一个占位符文
  • 禁用单一样式的 CSS 转换?

    为单个样式启用 CSS 过渡非常容易 但是是否可以为单个样式禁用它们 单一样式过渡的常用方法是 div transition opacity 0 5s 但我想做的是设置一个全局转换 然后为单个属性禁用它 也许是这样的 div transit
  • Firefox 插件查找未使用的 CSS 样式[重复]

    这个问题在这里已经有答案了 可能的重复 识别未使用的 CSS 定义的工具 https stackoverflow com questions 135657 tool to identify unused css definitions 假设
  • 如何在光标下的所有元素上调用 mouseover?

    我有一个网络应用程序 每次单击时都会创建一个点 见下文 当我将鼠标悬停在一堆点上时 我希望光标下的每个点都会触发 mouseover 或 mouseenter 事件 然而 只有一个事件被触发 即堆栈 顶部 的点的事件 当鼠标移动到一堆多个点
  • Firefox:如何测试首选颜色方案?

    在 Firefox 67 中 可以使用媒体查询来检测用户对浅色或深色主题的偏好 https davidwalsh name demo prefers color scheme php 在我的 Firefox 版本 在 Ubuntu 下 中
  • iOS 5 中的 webkit-overflow-scrolling: touch "handle" 是否有外观 CSS 规则?

    我有一个元素恰好同时具有 webkit overflow scrolling touch 和 background color black 因此显示滚动位置的 手柄 很难看到 是否有 webkit CSS 样式规则可以改变该 手柄 的外观

随机推荐

  • 通过adb命令安装卸载apk

    一 安装apk xff1a 1 正常安装APK adb install xxxx apk 2 覆盖安装APK adb install r xxxx apk 2 安装测试APK adb install t xxxx apk 3 组合使用 ad
  • 使用VNC远程连接云服务器,连接超时问题

    这里用的本地VNC工具为VNC viewer xff0c 使用的服务器为腾讯云CentOS服务器 已经在服务器端完成了图形化界面的安装以及开启vncserver xff0c 但是无法连接 已经创建完成vnc的服务器端 开启vnc命令 vnc
  • Spring框架的知识整理(项目流程)以及SSM框架的整合

    前言 上一篇文章我们发表Mybatis框架的学习心得 xff0c 以及针对一个项目而言说了一些流程 Spring学习的时候我们需要知道它的两个核心功能Ioc Aop xff0c 本文今日对Ioc做重点解释 Ioc功能阐述 Ioc 主要是一个
  • Ubuntu安装文件

    安装Java 首先在官网下载linux版本的jdk 然后传给linux xff0c 在解压到 usr local目录下 xff0c 在进入 url local目录 xff0c 并完成环境配置 tar zxvf jdk 8u331 linux
  • 快速排序(java实现)

    快速排序的思想 在一个无序的数组中 xff0c 取最后的一个数字为基准值 xff0c 在经过一次排序后 xff0c 使得改无效而的数组中 xff0c 小于基准值的在左侧 xff0c 等于基准值的在中间 xff0c 大于基准值的在右侧 假设一
  • 使用websocket实现服务端主动发送消息到客户端

    平时我们都是由客户端浏览器主动发送请求到服务端 xff0c 然后服务器处理请求后返回结果 xff0c 服务器无法主动向客户端浏览器发送消息 但是在某些业务场景下我们需要由服务器主动发送消息到客户端浏览器 xff0c 如当客户用户下订单后 x
  • Day01-Vue的基本格式

    创建Vue实例传入的options 我们在创建Vue的时候 xff0c 会传入一个对象options 这个options包含哪些选项 xff1f 目前掌握这些选项 el 类型 xff1a string HTMLElement xff08 表
  • LAMP架构超详细搭建步骤

    LAMP介绍 xff1a Linux 43 Apache 43 Mysql MariaDB 43 Perl PHP Python一组常用来搭建或者服务器的开源软件 xff0c 本身都是各自独立的程序 xff0c 但是因为常被放在一起使用 x
  • ViewBinding的简单使用

    我们知道ButterKnife已经过时 首先开启viewBinding xff1a android viewBinding enabled 61 true 之后在Activity中操作 span class token keyword pa
  • linux系统下防火墙的使用以及开通端口

    1 基本使用 启动 xff1a systemctl start firewalld 关闭 xff1a systemctl stop firewalld 查看状态 xff1a systemctl status firewalld 开机禁用 x
  • 如何让自己电脑的cmd看起来更美观

    一 快速切换cmd字体颜色 xff08 暂时性 xff09 打开cmd输入color 02 二 永久性切换cmd文字颜色 打开cmd xff0c 在标题栏处鼠标右键选择属性 选择颜色 xff0c 切换自己喜欢的颜色 xff0c 点击确定即可
  • Android 音频开发——Radio Hal服务(三)

    nbsp nbsp nbsp nbsp nbsp nbsp nbsp 上一篇文章主要介绍了 BroadcastRadioService 的启动 这一篇我们介绍以下Radio Hal 层的服务 一 Radio模块的加载 nbsp nbsp n
  • java锁策略和synchronized锁机制

    一 常见的锁策略 1 乐观锁 vs 悲观锁 锁的实现者 xff0c 预测接下来的锁冲突概率大不大 xff0c 根据这个概率决定接下来该做什么 乐观锁 xff1a 预测冲突不大 xff0c 做的工作少一些 xff0c 效率更高一些 悲观锁 x
  • 【蓝桥杯java-学习笔记】单词中出现次数最多的字母和次数

    字符串 输入描述 输入一行包含一个单词 xff0c 单词只由小写英文字母组成 hello 输出描述 输出两行 xff0c 第一行包含一个英文字母 xff0c 表示单词中出现得最多的字母是哪 个 如果有多个字母出现的次数相等 xff0c 输出
  • 解决Use ‘docker scan‘ to run Snyk tests against images to find vulnerabilities and learn how to fix

    解决方法 在终端输入 xff1a sudo export DOCKER SCAN SUGGEST 61 false
  • 子集全排列组合数问题(带你轻松拿捏十一道OJ题)

    目录 一 子集 二 子集II 三 全排列 四 全排列II 五 字符全排列 六 字符串大小全排列 七 组合总和 八 组合总和II 九 组合总和III 十 组合总和IV 十一 递增子序列 一 子集 剑指 Offer II 079 所有子集 力扣
  • 操作系统笔记(本科必修课)

    1 操作系统概论 1 1 定义 操作系统是计算机系统中的一个系统软件 xff0c 是一些程序模块的集合 能以尽量有效 合理的方式组织和管理计算机的软 硬件资源 xff0c 合理的组织计算机的工作流程 xff0c 控制程序的执行并向用户提供各
  • linux远程登录

    ssh实验 1 两台机器 xff1a 第一台机器作为客户端 xff0c 第二台机器作为服务器 xff0c 在第一台使用rhce xff08 我用的是user1用户 xff09 用户免密登录第二台机器 2 禁止root用户远程登录和设置三个用
  • Spring的工作流程

    经过十多天的学习 xff0c 我的脑海中开始对spring框架有了基本的认识 首先我了解了spring框架的几个基本的常见的类 xff1a BeanFactory BeanDefinition BeanFactoryPostProfesso
  • 【爬虫】2.5 BeautifulSoup使用 CSS 语法查找元素

    1 使用 CSS 语法 BeautifulSoup 除了可以使用 find 与 find all 函数查找 HTML 文档树的结点元素外 xff0c 还可以采用 CSS 类似的语法来查询 xff0c 规则是 xff1a tag select