30. PyQuery: 基于HTML的CSS选择器

news2025/1/16 18:49:11

目录

前言 

导包

基本用法

按标签选择

标签链式操作

简便链式:后代选择器

类选择器 

id 选择器 

属性/文本选择器(重点)

改进多标签拿属性方法

快速总结

PyQuery的强大功能:修改源代码

添加代码块

修改/添加属性

删除属性/标签等

总结


前言 

我们在前面的章节认识了CSS与CSS选择器的概念, 本节我们介绍一个Python模块: PyQuery. 

可能有些小伙伴认识Java中的JQuery, 其实PyQuery和它是异曲同工的. 


导包

from pyquery import PyQuery


基本用法

常用的就下列几种:

 下面通过实例讲解:

html = """
    <ul>
       <li class="aaa"><a href="http://www.google.com">谷歌</a></li>
       <li class="aaa"><a href="http://www.baidu.com">百度</a></li>
       <li class="bbb" id="qq"><a href="http://www.qq.com">腾讯</a></li>
       <li class="bbb"><a href="http://www.csdn.net">CSDN</a></li>
   </ul>
"""

# 加载html内容
p = PyQuery(html)

print(p)
print(type(p))

导入一段简单的html,用PyQuery接口加载html内容,打印看输出结果,发现就是html本身的内容。那么再打印一次它的类型,看看是不是什么都没有做,发现它是PyQuery类

PyQuery对象有什么用呢?

它可以把html加载起来,随后就可以在其后进行CSS选择器的操作了。

关于CSS选择器的知识点我们在上一节已经讲过,不懂的同学可以移步上一行的超链接传送门。

按标签选择

# pyquery对象直接(css选择器)

a = p("a")
print(a)
print(type(a))  # 依然是pyquery对象

可以筛选出所有a标签对象,而筛选结果依然是PyQuery对象,由此我们可以得出下例。

标签链式操作

# 链式操作
a = p("li")("a")
print(a)

 

由于筛选后还是PyQuery对象,所以我们可以继续筛选。上述例子就是先筛选出 li 标签,再在其中筛选 a 标签并打印输出。

简便链式:后代选择器

a = p("li a")
print(a)

这样的输出结果和上面是一样的。用了CSS选择器的语法:后代选择器,筛选包含在 li 标签的所有 a 标签。

类选择器 

a = p(".aaa a")  # class="aaa"
print(a)

查询结果为class为aaa的标签下包含的所有 a 标签。

id 选择器 

a = p("#qq a")  # id="qq"
print(a)

查询结果为 id 为 qq 的标签下包含的所有 a 标签。

属性/文本选择器(重点)

href = p("#qq a").attr('href')  # 拿属性
text = p("#qq a").text()  # 拿文本
print(href)
print(text)

查询结果为 id 为 qq 的标签下包含的 a 标签的 href 属性和它所包含的文本内容。

注意:如果多个标签同时拿属性,只能拿到第一个:

# 坑, 如果多个标签同时拿属性. 只能默认拿到第一个
href = p("li a").attr("href")
print(href)

多个标签同时拿属性,找到一个就返回了,不能这样写。

改进多标签拿属性方法

# 多个标签拿属性
it = p("li a").items()
for item in it:  # 从迭代器中拿到每一个标签
    href = item.attr("href")  # 拿到href属性\
    text = item.text()
    print(text, href)

用items()方法将标签化为列表,然后用循环的方法遍历列表,抓到每一个里面的href属性打印输出即可。

快速总结

1. pyquery(选择器)
2. items()  当选择器选择的内容很多的时候. 需要一个一个处理的时候
3. attr(属性名)  获取属性信息
4. text() 获取文本


PyQuery的强大功能:修改源代码

PyQuery和其他查询最大的区别就在于它可以修改网页源代码让他变得“整齐”,也就便于我们抓取信息等操作。

如下例所示:

添加代码块

html = """
<HTML>
    <div class="aaa">哒哒哒</div>
    <div class="bbb">嘟嘟嘟</div>
</HTML>
"""

p = PyQuery(html)

# 在xxxx标签后面添加xxxxx新标签
p("div.aaa").after("""<div class="ccc">吼吼吼</div>""")
p("div.aaa").append("""<span>我爱你</span>""")
print(p)

上述代码第11行的含义是在aaa类的div标签后面添加一行after里包含的代码块;

上述代码第12行的含义是在aaa类的div标签内部添加一行append里包含的代码块。

修改/添加属性

p("div.bbb").attr("class", "ccc")  # 修改属性
p("div.ccc").attr("id", "12306")  # 新增属性, 前提是该标签没有这个属性
print(p)

修改/添加属性用的都是 .attr() 这个方法 ,如果有这个属性,那么对应的就是修改,没有就是新增。

其实可以类比Python的字典键值对,很好理解。

删除属性/标签等

p("div.ccc").remove_attr("id")  # 删除属性
p("div.aaa").remove()  # 删除标签
print(p)

上述代码移除了class为ccc的div的id属性,和class为aaa的div标签本身。 

 

可以用上述方法分别移除筛选出的标签本身、标签属性、标签类、标签名字域(不常用)。


总结

本节我们讨论了PyQuery的基本用法和他的特殊之处,下一节将进行实战练习,用实例展示何时用PyQuery最合适。(也就是我们提到的让源代码变得“整齐”而使信息容易提取)

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

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

java spring IOC xml方式注入(数组 list集合 map集合 set集合)类型属性

我们先创建一个基本的java项目 然后引入 spring 的基本依赖 然后在src下创建一个包 我这里叫 collectiontype 和我同名 会避免一些找不到资源的麻烦 毕竟说 你们开发代码大部分会在这篇文章拿过去 当然 名称是看自己去取的 只是和我同名会方便一些 直接复制过去就好了 然后在…

C语言函数定义

函数是一段可以重复使用的代码&#xff0c;用来独立地完成某个功能&#xff0c;它可以接收用户传递的数据&#xff0c;也可以不接收。接收用户数据的函数在定义时要指明参数&#xff0c;不接收用户数据的不需要指明&#xff0c;根据这一点可以将函数分为有参函数和无参函数。将…

ARP渗透与攻防(七)之Ettercap Dns劫持

系列文章 ARP渗透与攻防(一)之ARP原理 ARP渗透与攻防(二)之断网攻击 ARP渗透与攻防(三)之流量分析 ARP渗透与攻防(四)之WireShark截获用户数据 ARP渗透与攻防(五)之Ettercap劫持用户流量 ARP渗透与攻防(六)之限制网速攻击 ARP-Ettercap Dns劫持 1.什么是DNS 1.概念 DNS是D…

汇编语言学习 下

本文承接汇编语言学习笔记 上 上篇文章记录了汇编语言寄存器&#xff0c;汇编语言基本组成部分&#xff0c;数据传送指令&#xff0c;寻址指令&#xff0c;加减法指令&#xff0c;堆栈&#xff0c;过程&#xff0c;条件处理&#xff0c;整数运算的内容 高级过程 大多数现代编程…

通信原理简明教程 | 信号、信道与噪声

文章目录1 信号与系统的基本概念2 傅里叶变换与信号的频谱2.1 信号的频谱2.2 傅里叶变换的常用性质2.3 信号的能量谱、功率谱与自相关函数2.4 信号的带宽3 线性系统与滤波器3.1 线性系统及其频率特性3.2 系统响应的频域求解3.3 滤波器2.4 信道及其特性4.1 信道的分类4.2 信道的…

兔年伊始谈闲书:三体-乌合之众-百年孤独 和《猫城记》(随笔)

引言 “ 各位读者&#xff0c;我们都兔年大吉&#xff0c;新春快乐。我本想写一篇《公有云换帅转舵后的错误经验和正经歪念》&#xff0c;但刚过年就炮火味十足&#xff0c;觉得有失体面。所以就写了篇读书的散记杂记。本文和云计算行业完全无关&#xff0c;就是一个有常识性阅…

[数据结构基础]排序算法第一弹 -- 直接插入排序和希尔排序

一. 排序的概念及分类 1.1 排序的概念 排序&#xff0c;就是使一串数据&#xff0c;按照其中的某个或某些关键字的大小&#xff0c;递增或递减的排列起来的操作。 1.2 常见的排序算法 图1.1按照排序算法的思想&#xff0c;将排序分为四大类&#xff1a;插入排序、选择排序…

OpenGL相关库及其关系概述

目录 1、OpenGL 2. .GLUT 3、Freeglut 4、glew 5、glfw 6、glad 1、OpenGL OpenGL只有框架没有实现&#xff0c;换句话说就是OpenGL只有函数声明没有源文件实现&#xff0c;类似于接口和虚函数。所有的实现是显卡生产商提供。比如NVIDIA或者AMD就要自己实现OpenGL函数内容…

前后端登录逻辑讲解-本文使用RSA加密过程-附代码

文章目录一、项目环境二、生成公钥私钥1.生成私钥2.查看私钥3.生成公钥4.查看公钥三、安装依赖包四、自测加解密1.纯前端自测2.前后端联调①前端登录代码改为&#xff1a;②后端登录接口代码&#xff1a;③验证五、与数据库密码进行对比&#xff08;数据库是进行了bcryptjs加密…

关于非授权访问的逻辑漏洞挖掘

简介 挖洞的时候日常笔记&#xff0c;很多细节都写得不好&#xff0c;师傅们不要介意 开始 获取目标&#xff1a;https://fofa.info/ 在fofa上输入body“后台登录”&#xff0c;可以看到一大堆目标&#xff0c;今天我打算去测试逻辑漏洞 进入目标地址 随意输入用户名和密码&…

Python LC Loan贷款数据集 统计分析 数据挖掘 研究报告

实验代码&#xff1a;https://download.csdn.net/download/Amzmks/87396462 首先读表 将有空值的列和完全相同的列删除 将数值型数据单独挑出来 将数值型数据从string转为float 用方差阈值法筛选特征较为明显的部分数值型数据 将文本型数据单独挑出来 去除所有的可能的头…

计算机存储系统

前言何为存储系统&#xff1f;存储系统是指计算机中由存放程序和数据的各种存储设备、控制部件及管理信息调度的设备&#xff08;硬件&#xff09;和算法&#xff08;软件&#xff09;所组成的系统。为何需要存储系统&#xff1f;信息是人类认知外界的方式&#xff0c;最初的信…

对CAS的理解

CAS的概念&#xff08;compare and swap&#xff09;:比较并交换我们首先要明白&#xff0c;自旋是一个纯用户态的操作&#xff0c;本身并没有进行加锁&#xff0c;所执行的代码&#xff0c;是在并发环境下执行的&#xff0c;没有锁。我们举一个例子来说明自旋加CAS的作用&…

Day05 C++STL入门基础知识三——String容器(上)概念-构造-赋值-拼接-查找-替换【全面深度剖析+例题代码展示】

文章目录1. 基本概念1.1 本质1.2 string与char*的区别1.3 特点2. 构造函数2.1 四种构造2.2 举例展示3. 赋值操作3.1 七种赋值函数原型&#xff08;operator等号赋值/assign成员函数赋值&#xff09;3.2 举例展示4. 拼接操作4.1 七种拼接函数原型4.2 举例展示5. 查找操作5.1 八种…

分布式概念

目录一、什么是分布式二、分布式与集群的关系三、软件架构演变四、RPC是什么1.RPC思想原理2.服务之间的交互可以用两种方式五、分布式思想与基本概念1.高并发2.高可用3.注册中心4.负载均衡5.服务雪崩6.熔断7.限流8.API网关9.服务跟踪10.弹性云一、什么是分布式 《分布式系统原…

Python流程控制语句之循环语句

上一篇&#xff1a;Python流程控制语句之选择语句 文章目录前言一、while 循环二、for 循环1. 进行数值循环2. 遍历字符串三、循环嵌套总结前言 生活中很多问题都无法一次解决&#xff0c;就像谚语所说&#xff1a;罗马不是一天建成的。一些事物必须周而复始地运转才能保证其存…

linux并发控制详解

目录 1.并发控制 1.1.并发概念 1.2.并发问题 2.多CPU核心 3.解决 4.中断屏蔽 5.原子操作 6.自旋锁 7.自旋锁衍生读写自旋锁 7.1.自旋锁与读写自旋锁的对比&#xff1a; 8.读写自旋锁衍生顺序锁 9.RCU 10.信号量 11.互斥体&#xff08;互斥锁&#xff09; 11.1.互…

2023起点上,一段迷茫的自我倾诉

大家新年快乐。 回顾记忆中渐渐远去的2022。 我曾想象随着一年过去我就能取得很大的进步&#xff0c;“彻底”改变自己的生活状态。其实不过幻想罢了&#xff0c;人才不会无缘无故进步呢。 我曾一度沉溺于网络世界中的关注&#xff0c;想象着自己将可以取得一些成就&#xff…

【每日一道智力题】三个火枪手(快来看人生哲理)

&#x1f680;write in front&#x1f680; &#x1f4dc;所属专栏&#xff1a; &#x1f6f0;️博客主页&#xff1a;睿睿的博客主页 &#x1f6f0;️代码仓库&#xff1a;&#x1f389;VS2022_C语言仓库 &#x1f3a1;您的点赞、关注、收藏、评论&#xff0c;是对我最大的激励…

Qt 之 QSystemTrayIcon

文章目录一、QSystemTrayIcon是什么二、属性三、公共类型四、信号提示&#xff1a;以下是本篇文章正文内容&#xff0c;下面案例可供参考 一、QSystemTrayIcon是什么 QSystemTrayIcon类为应用程序在系统托盘中提供一个图标。 如下图&#xff1a; 现代操作系统通常在桌面上提…