当前位置: 首页 > news >正文

【parsel】------- PYTHON爬虫基础4

parsel 这个库可以对 HTML 和 XML 进行解析,并支持使用 XPath 和 CSS Selector 对内容进行提取和修改,同时它还融合了正则表达式提取的功能。

内容目录

  • from parsel import Selector
  • ==提取节点==
    • 提取 class 包含 item-0 的节点
  • ==提取文本==
    • 获取提取到的所有 li 节点的文本内容
    • 提取文本时get 和 getall 的区别
  • ==提取属性==

from parsel import Selector

提取节点

提取 class 包含 item-0 的节点

python3环境下输入:

html = '''
<div><ul><li class="item-0">first item</li><li class="item-1"><a href="link2.html">second item</a></li><li class="item-0 active"><a href="link3.html"><span class="bold">third item</span></a></li><li class="item-1 active"><a href="link4.html">fourth item</a></li><li class="item-0"><a href="link5.html">fifth item</a></li></ul></div>
'''
from parsel import Selector
selector = Selector(text=html)   # 将 HTML 字符串,赋值为 selector 变量
# print(selector)# 提取 class 包含 item-0 的节点
# css方法
items = selector.css('.item-0')
print(len(items), type(items), items)   # 结果是一个可迭代对象 SelectorList
# xpath方法
items2 = selector.xpath('//li[contains(@class, "item-0")]')
print(len(items2), type(items2), items2)

知识点:

  1. 将 HTML 字符串,赋值为 selector 变量:selector = Selector(text=html)。
  2. css方法提取 class 包含 item-0 的节点:selector.css(‘.item-0’)。
  3. xpath方法提取 class 包含 item-0 的节点:selector.xpath(‘//li[contains(@class, “item-0”)]’)。
  4. 两种方法返回的结果都是一个可迭代对象 SelectorList,长度都为3,具体结果看输出。

结果输出为:

3 <class 'parsel.selector.SelectorList'> [<Selector xpath="descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' item-0 ')]" data='<li class="item-0">first item</li>\n  ...'>, <Selector xpath="descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' item-0 ')]" data='<li class="item-0 active"><a href="li...'>, <Selector xpath="descendant-or-self::*[@class and contains(concat(' ', normalize-space(@class), ' '), ' item-0 ')]" data='<li class="item-0"><a href="link5.htm...'>]
3 <class 'parsel.selector.SelectorList'> [<Selector xpath='//li[contains(@class, "item-0")]' data='<li class="item-0">first item</li>\n  ...'>, <Selector xpath='//li[contains(@class, "item-0")]' data='<li class="item-0 active"><a href="li...'>, <Selector xpath='//li[contains(@class, "item-0")]' data='<li class="item-0"><a href="link5.htm...'>]

提取文本

获取提取到的所有 li 节点的文本内容

for item in items:text = item.xpath('.//text()').get()  # 仍是一个可迭代对象 SelectorListprint(text)

知识点:

遍历 items , 利用xpah 提取所有 li 节点的文本内容:text = item.xpath(‘.//text()’).get() ,结果如下。

结果输出为:

first item
third item
fifth item

提取文本时get 和 getall 的区别

# 提取 SelectorList 里面对应的结果,可以使用 get 或 getall 方法 
# xpath 方法
result = selector.xpath('//li[contains(@class, "item-0")]//text()').get()
print(result)    
result = selector.xpath('//li[contains(@class, "item-0")]//text()').getall()
print(result)
# css 方法
result = selector.css('.item-0 *::text').get()  # *用来提取第一个子节点
print(result)
result = selector.css('.item-0 *::text').getall()  # *用来提取所有子节点
print(result)

知识点:

get 和 getall 对于xpath和css都通用。
get() :用来提取第一个子节点
getall() :用来提取所有子节点

结果输出为:

first item
['first item', 'third item', 'fifth item']
first item
['first item', 'third item', 'fifth item']

提取属性

# 提取属性########################################
result = selector.css('.item-0.active a::attr(href)').get()
print(result)
result = selector.xpath('//li[contains(@class, "item-0") and contains(@class, "active")]/a/@href').get()
print(result)
result = selector.css('.item-0').re('link.*')  
# re 方法在这里遍历了所有提取到的 Selector 对象,然后根据传入的正则表达式查找出符合规则的节点源码并以列表的形式返回。
print(result)
result = selector.css('.item-0 *::text').re('.*item')  
# 调用 css 方法时已经提取了进一步的结果,比如提取了节点文本值,那么 re 方法就只会针对节点文本值进行提取
print(result)
result = selector.css('.item-0').re_first('<span class="bold">(.*?)</span>')   # 输出的结果就是小括号部分对应的结果
print(result)

结果输出为:

link3.html
link3.html
['link2.html">second item</a></li>', 'link3.html"><span class="bold">third item</span></a></li>', 'link4.html">fourth item</a></li>', 'link5.html">fifth item</a></li>', 'link3.html"><span class="bold">third item</span></a></li>', 'link4.html">fourth item</a></li>', 'link5.html">fifth item</a></li>', 'link5.html">fifth item</a></li>']
['first item', 'third item', 'fifth item']
third item

相关文章:

【parsel】------- PYTHON爬虫基础4

parsel 这个库可以对 HTML 和 XML 进行解析&#xff0c;并支持使用 XPath 和 CSS Selector 对内容进行提取和修改&#xff0c;同时它还融合了正则表达式提取的功能。 内容目录 from parsel import Selector提取节点提取 class 包含 item-0 的节点 提取文本获取提取到的所有 li…...

MySQL数据库从入门到精通学习第8天(表数据的查询)

表数据的查询 基本查询语句单表查询聚合函数查询多表连接查询子查询合并查询结果定义表和字段的别名使用正则表达式查询 基本查询语句 SELECT 语句非常的强大&#xff0c;是最常用的查询语句。他具有一个固定的格式&#xff0c;如下&#xff1a; SELECT 查询的内容 FROM 数据…...

什么是IPAM?如何使用IPAM来管理IP地址和DHCP?

在计算机网络中&#xff0c;IPAM&#xff08;IP Address Management&#xff09;是一种用于管理IP地址和DHCP&#xff08;Dynamic Host Configuration Protocol&#xff09;的工具或系统。IPAM旨在简化和集中管理IP地址分配、子网划分和DHCP配置等任务。本文将详细介绍IPAM的概…...

PCIE学习

目录 一、PCIE结构1、层次结构2、数据包TLPDLLP PCIE寄存器配置1、基址寄存器的作用2、基址寄存器的位置 三、PCIE读取数据 一、PCIE结构 1、层次结构 绝大多数的总线或者接口&#xff0c;都是采用分层实现的。PCIe也不例外&#xff0c;它的层次结构如下&#xff1a; PCIe定…...

商业智力,Social焕新|数说故事重磅发布“SocialGPT”,国内首个专注Social领域的商业大模型

AGI时代的到来&#xff0c;市场风云变幻&#xff0c;世界正在经历着一场技术革命的颠覆性洗礼。 2023年6月6日6时&#xff0c;数说故事正式对外发布数说故事“SocialGPT”&#xff0c;国内首个专注Social领域的商业大模型。数说故事“SocialGPT”大家昵称它为“社牛”大模型&a…...

STM32HAL库RS485-ModBus协议控制伺服电机

STM32HAL库RS485-ModBus协议控制伺服电机 一个月前&#xff0c;接手了一个学长的毕设小车&#xff0c;小车采用rs485通信的modbus协议驱动轮毂电机&#xff0c;与往常我学习的pwm控制电机方法大相径庭&#xff0c;在这里以这篇博客记录下该学习过程。 小车主要架构 电机型号 …...

【医学图像】图像分割系列.3 (uncertainty)

介绍几篇使用不确定性引导的医学图像分割论文&#xff1a;UA-MT&#xff08;MICCAI2019&#xff09;&#xff0c;SSL4MIS&#xff08;MICCAI2021&#xff09;&#xff0c;UG-MCL&#xff08;AIIM2022&#xff09;. Uncertainty-aware Self-ensembling Model for Semi-supervise…...

Java有线程安全的set吗?

在Java中&#xff0c;有线程安全的Set实现。一个常用的线程安全的Set实现是ConcurrentSkipListSet。ConcurrentSkipListSet是一个有序的集合&#xff0c;基于跳表(SkipList)的数据结构实现。它提供了线程安全的操作&#xff0c;并且具有较好的性能。 接下来笔者用一段简单的Jav…...

《HelloGitHub》第 86 期

兴趣是最好的老师&#xff0c;HelloGitHub 让你对编程感兴趣&#xff01; 简介 HelloGitHub 分享 GitHub 上有趣、入门级的开源项目。 https://github.com/521xueweihan/HelloGitHub 这里有实战项目、入门教程、黑科技、开源书籍、大厂开源项目等&#xff0c;涵盖多种编程语言 …...

LDGRB-01 3BSE013177R1 将数字输入和继电器输出结合

LDGRB-01 3BSE013177R1包的一部分是全面的通信选项&#xff0c;包括Modbus主/从或CS31&#xff0c;这种产品很少提供。128kB的用户内存和0.1秒/指令的程序处理时间只是AC500-eCo令人印象深刻的性能的两个例子。除了与现有AC500系列的互操作性&#xff0c;AC500-eCo系统还使用基…...

手动计算校正年龄、性别后的标准化死亡率 (SMR)

分析队列人群有无死亡人数超额&#xff0c;通常应用标准人群死亡率来校正&#xff0c;即刻观察到中的实际死亡数&#xff08;D&#xff09;与定一个标准的死亡人数&#xff08;E&#xff09;&#xff0c;D与E之比称为死亡比&#xff08;standarized Mortality ratio&#xff0c…...

Java组合模式:构建多层次公司组织架构

在现实生活中&#xff0c;常常会遇到用树形结构组织的一些场景&#xff0c;比如国家省市&#xff0c;学校班级&#xff0c;文件目录&#xff0c;分级导航菜单&#xff0c;以及典型的公司组织架构&#xff0c;整个层次结构自顶向下呈现一颗倒置的树。这种树形结构在面向对象的世…...

Langchain-ChatGLM:基于本地知识库问答

文章目录 ChatGLM与Langchain简介ChatGLM-6B简介ChatGLM-6B是什么ChatGLM-6B具备的能力ChatGLM-6B具备的应用 Langchain简介Langchain是什么Langchain的核心模块Langchain的应用场景 ChatGLM与Langchain项目介绍知识库问答实现步骤ChatGLM与Langchain项目特点 项目主体结构项目…...

设计模式十 适配器模式

适配器模式 适配器模式是一种结构型设计模式。作用&#xff1a;当接口无法和类匹配到一起工作时&#xff0c;通过适配器将接口变换成可以和类匹配到一起的接口。&#xff08;注&#xff1a;适配器模式主要解决接口兼容性问题&#xff09; 适配器的优点与缺点&#xff1a; 优…...

1.6 初探JdbcTemplate操作

一、JdbcTemplate案例演示 1、创建数据库与表 &#xff08;1&#xff09;创建数据库 执行命令&#xff1a;CREATE DATABASE simonshop DEFAULT CHARACTER SET utf8mb4 COLLATE utf8mb4_unicode_ci; 或者利用菜单方式创建数据库 - simonshop 打开数据库simonshop &#x…...

为什么要用线程池?

线程池是一种管理和复用线程资源的机制&#xff0c;它由一个线程池管理器和一组工作线程组成。线程池管理器负责创建和销毁线程池&#xff0c;以及管理线程池中的工作线程。工作线程则负责执行具体的任务。 线程池的主要作用是管理和复用线程资源&#xff0c;避免了线程的频繁…...

c语言的预处理和编译

预处理 文件包含 当预处理器发现#include指令时&#xff0c;会查看后面的文件名并把文件的内容包含到当前文件中 两种写法 尖括号&#xff1a;引用的是编译器的库路径里面的头文件。 双引号&#xff1a;引用的是程序目录中相对路径中的头文件&#xff0c;如果找不到再去上面…...

网络安全必学 SQL 注入

1.1 .Sql 注入攻击原理 SQL 注入漏洞可以说是在企业运营中会遇到的最具破坏性的漏洞之一&#xff0c;它也是目前被利用得最多的漏洞。要学会如何防御 SQL 注入&#xff0c;首先我们要学习它的原理。 针对 SQL 注入的攻击行为可描述为通过在用户可控参数中注入 SQL 语法&#x…...

Docker基础知识详解

✅作者简介&#xff1a;热爱Java后端开发的一名学习者&#xff0c;大家可以跟我一起讨论各种问题喔。 &#x1f34e;个人主页&#xff1a;Hhzzy99 &#x1f34a;个人信条&#xff1a;坚持就是胜利&#xff01; &#x1f49e;当前专栏&#xff1a;文章 &#x1f96d;本文内容&am…...

腾讯、阿里入选首批“双柜台证券”,港股市场迎盛夏升温?

6月5日&#xff0c;香港交易所发布公告&#xff0c;将于6月19日在香港证券市场推出“港币&#xff0d;人民币双柜台模式”&#xff0c;当日确定有21只证券指定为双柜台证券。同时&#xff0c;港交所还表示&#xff0c;在双柜台模式推出前&#xff0c;更多证券或会被接纳并加入双…...

最新SpringBoot+SpringCloud+Nacos微服务框架分享

文章目录 前言一、服务规划二、架构核心1.cloud的pom2.gateway的异常handler3.gateway的filter4、admin的pom5、admin的登录核心 三、code-helper分享总结 前言 最近有个活蛮赶的&#xff0c;根据Excel列的需求预估的工时直接打骨折&#xff0c;不要问我为什么&#xff0c;主要…...

BCS 2025|百度副总裁陈洋:智能体在安全领域的应用实践

6月5日&#xff0c;2025全球数字经济大会数字安全主论坛暨北京网络安全大会在国家会议中心隆重开幕。百度副总裁陈洋受邀出席&#xff0c;并作《智能体在安全领域的应用实践》主题演讲&#xff0c;分享了在智能体在安全领域的突破性实践。他指出&#xff0c;百度通过将安全能力…...

【JavaSE】绘图与事件入门学习笔记

-Java绘图坐标体系 坐标体系-介绍 坐标原点位于左上角&#xff0c;以像素为单位。 在Java坐标系中,第一个是x坐标,表示当前位置为水平方向&#xff0c;距离坐标原点x个像素;第二个是y坐标&#xff0c;表示当前位置为垂直方向&#xff0c;距离坐标原点y个像素。 坐标体系-像素 …...

JVM虚拟机:内存结构、垃圾回收、性能优化

1、JVM虚拟机的简介 Java 虚拟机(Java Virtual Machine 简称:JVM)是运行所有 Java 程序的抽象计算机,是 Java 语言的运行环境,实现了 Java 程序的跨平台特性。JVM 屏蔽了与具体操作系统平台相关的信息,使得 Java 程序只需生成在 JVM 上运行的目标代码(字节码),就可以…...

Linux 中如何提取压缩文件 ?

Linux 是一种流行的开源操作系统&#xff0c;它提供了许多工具来管理、压缩和解压缩文件。压缩文件有助于节省存储空间&#xff0c;使数据传输更快。本指南将向您展示如何在 Linux 中提取不同类型的压缩文件。 1. Unpacking ZIP Files ZIP 文件是非常常见的&#xff0c;要在 …...

认识CMake并使用CMake构建自己的第一个项目

1.CMake的作用和优势 跨平台支持&#xff1a;CMake支持多种操作系统和编译器&#xff0c;使用同一份构建配置可以在不同的环境中使用 简化配置&#xff1a;通过CMakeLists.txt文件&#xff0c;用户可以定义项目结构、依赖项、编译选项等&#xff0c;无需手动编写复杂的构建脚本…...

【Kafka】Kafka从入门到实战:构建高吞吐量分布式消息系统

Kafka从入门到实战:构建高吞吐量分布式消息系统 一、Kafka概述 Apache Kafka是一个分布式流处理平台,最初由LinkedIn开发,后成为Apache顶级项目。它被设计用于高吞吐量、低延迟的消息处理,能够处理来自多个生产者的海量数据,并将这些数据实时传递给消费者。 Kafka核心特…...

yaml读取写入常见错误 (‘cannot represent an object‘, 117)

错误一&#xff1a;yaml.representer.RepresenterError: (‘cannot represent an object’, 117) 出现这个问题一直没找到原因&#xff0c;后面把yaml.safe_dump直接替换成yaml.dump&#xff0c;确实能保存&#xff0c;但出现乱码&#xff1a; 放弃yaml.dump&#xff0c;又切…...

RabbitMQ 各类交换机

为什么要用交换机&#xff1f; 交换机用来路由消息。如果直发队列&#xff0c;这个消息就被处理消失了&#xff0c;那别的队列也需要这个消息怎么办&#xff1f;那就要用到交换机 交换机类型 1&#xff0c;fanout&#xff1a;广播 特点 广播所有消息​​&#xff1a;将消息…...

基于小程序老人监护管理系统源码数据库文档

摘 要 近年来&#xff0c;随着我国人口老龄化问题日益严重&#xff0c;独居和居住养老机构的的老年人数量越来越多。而随着老年人数量的逐步增长&#xff0c;随之而来的是日益突出的老年人问题&#xff0c;尤其是老年人的健康问题&#xff0c;尤其是老年人产生健康问题后&…...