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

Python爬虫:XPath基本语法

XPath(XML Path Language)是一种用于在XML文档中定位元素的语言。它使用路径表达式来选择节点或节点集,类似于文件系统中的路径表达式。

不啰嗦,讲究使用,直接上案例。

导入

pip3 install lxmlfrom lxml import etree

案例样本

xml = '''<html lang="zh"><head><meta charset="UTF-8"><title>示例网页</title></head><body><h1>欢迎来到我的网站</h1><p>这是一个简单的HTML页面,用于演示XPath解析。</p><ul><li><a href="https://www.example.com/page1">链接1</a></li><li><a href="https://www.example.com/page2">链接2</a></li><li><a href="https://www.example.com/page3">链接3</a></li></ul><div id="content"><h2>内容标题</h2><p>这是一段内容。</p><p>这是另一段内容。</p></div></body></html>
'''
扫一扫欢迎关注,一起学习!

基本语法

表达式

描述

/

从根节点选取

//

从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置(取子孙节点)

.

选取当前节点

..

选取当前节点的父节点

@

选取属性

tree = etree.HTML(html)## 从根节点选取
data1 = tree.xpath('/html')
print('从根节点选取:',data1)## 取head下title的值
data2 = tree.xpath('/html/head/title/text()')
print('取head下title的值:',data2)## 取子孙节点值
data3 = tree.xpath('//p/text()')
print('取子孙节点值为:',data3)## 选取当前节点值
all_p = tree.xpath('//p')
for p in all_p:print('选取当前节点:',p.xpath('.')) # 获取值话:./text()print('选取当前节点父节点:',p.xpath('..'))## 获取html,lang属性
attr = tree.xpath('/html/@lang')
print('获取html,lang属性:',attr)## 获取所有href的属性
href = tree.xpath('//@href')
print('获取所有href的属性:',href)
从根节点选取: [<Element html at 0x105346cc0>]取head下title的值: ['示例网页']取子孙节点值为: ['这是一个简单的HTML页面,用于演示XPath解析。', '这是一段内容。', '这是另一段内容。']选取当前节点: [<Element p at 0x1055d1f40>]选取当前节点父节点: [<Element body at 0x1055d90c0>]选取当前节点: [<Element p at 0x1055d9040>]选取当前节点父节点: [<Element div at 0x1055d90c0>]选取当前节点: [<Element p at 0x1055d9080>]选取当前节点父节点: [<Element div at 0x1055d90c0>]获取html,lang属性: ['zh']获取所有href的属性: ['https://www.example.com/page1', 'https://www.example.com/page2', 'https://www.example.com/page3']

条件选择基本语法

1. 选取属于ul子元素的第一个li元素的a 值,这里从 1 开始

tree.xpath('/html/body/ul/li[1]/a/text()')

2. 选取属于ul子元素的最后一个li元素的a 值

tree.xpath('/html/body/ul/li[last()]/a/text()')

3. 选取属于ul子元素的倒数第二个li元素的a 值

tree.xpath('/html/body/ul/li[last()-1]/a/text()')

4. 选取所有拥有名为 href 的属性的 a 元素

tree.xpath('//a[@href]')

5. 选取所有拥有名为 id=content 的属性的 div 元素

tree.xpath('//div[@id="content"]')

6. 选取 ul 元素的所有 li 元素,且其中的 a 元素的值须为 链接2,如果是数值可以比大小运算

tree.xpath('/html/body/ul/li[a="链接2"]')

选取属于ul子元素的第一个li元素a值: ['链接1']选取属于ul子元素的最后一个li元素a值: ['链接3']选取属于ul子元素的最后一个li元素a值: ['链接2']选取所有拥有名为 href 的属性的 a 元素: [<Element a at 0x1026460c0>, <Element a at 0x102646140>, <Element a at 0x1026461c0>]选取所有拥有名为 id=content 的属性的 div 元素: [<Element div at 0x102646240>]选取 ul 元素的所有 li 元素,且其中的 a 元素的值须为 链接2: ['链接2']

通配符与运算选择基本语法

1. 选取 html 元素的所有子元素

tree.xpath('/html/*')

2. 选取文档中的所有元素

tree.xpath('//*')

3. 选取所有带有属性的 a 元素

tree.xpath('//a[@*]')

4. 选取 body 元素的所有 h1 和 p 元素

tree.xpath('//body/h1 | //body/p')

5. 选取文档中的所有 h1 和 p 元素

tree.xpath('//h1 | //p')
选取 html 元素的所有子元素: [<Element head at 0x1054de480>, <Element body at 0x1054de100>]选取文档中的所有元素: [<Element html at 0x10518ee40>, <Element head at 0x1054de040>, <Element meta at 0x1054de440>, <Element title at 0x1054de180>, <Element body at 0x1054de4c0>, <Element h1 at 0x1054de540>, <Element p at 0x1054de140>, <Element ul at 0x1054de580>, <Element li at 0x1054de5c0>, <Element a at 0x1054de300>, <Element li at 0x1054de500>, <Element a at 0x1054de380>, <Element li at 0x1054de600>, <Element a at 0x1054de400>, <Element div at 0x1054de640>, <Element h2 at 0x1054de680>, <Element p at 0x1054de200>, <Element p at 0x1054de240>]选取所有带有属性的 a 元素: [<Element a at 0x1054de300>, <Element a at 0x1054de380>, <Element a at 0x1054de400>]选取 body 元素的所有 h1 和 p 元素: [<Element h1 at 0x1054de4c0>, <Element p at 0x1054de140>]选取文档中的所有 h1 和 p 元素: [<Element h1 at 0x1054de440>, <Element p at 0x1054de140>, <Element p at 0x1054de200>, <Element p at 0x1054de240>]

相关文章:

Python爬虫:XPath基本语法

XPath&#xff08;XML Path Language&#xff09;是一种用于在XML文档中定位元素的语言。它使用路径表达式来选择节点或节点集&#xff0c;类似于文件系统中的路径表达式。 不啰嗦&#xff0c;讲究使用&#xff0c;直接上案例。 导入 pip3 install lxmlfrom lxml import etr…...

UML/SysML建模工具更新情况(截至2024年1月)(1)UModel 2024

最近一段时间更新的工具有&#xff1a; 工具最新版本&#xff1a;Umple 1.33.0 更新时间&#xff1a;2024年1月10日 工具简介 自称“Model-Oriented Programming”&#xff0c;把图形和文本结合起来&#xff0c;支持Java、PHP和Ruby代码生成&#xff0c;可以在线使用&#xf…...

ubuntu20-github不通问题

github不通 一直在github下载失败 Git报错fatal unable to connect to github.com: github.com[0: 20.205.243.166] >>> alsa-ucm-conf v1.2.6.3 Downloading(卡在这里,很烦啊) 然后搜了很多文档,然后以下操作: 1.GitHub.com - GitHub: Lets build from here Git…...

【MAC】Multi-Level Monte Carlo Actor-Critic阅读笔记

基本思想&#xff1a; 利用多层次蒙特卡洛方法&#xff08;Multi-Level Monte Carlo&#xff0c;MLMC&#xff09;和Actor-Critic算法&#xff0c;解决平均奖励强化学习中的快速混合问题。 快速混合&#xff1f; 在强化学习中&#xff0c;当我们说一个策略"混合得快"…...

[GN] 设计模式—— 创建型模式

文章目录 创建型模式单例模式 -- 确保对象唯一性例子优化饿汉式懒汉式 优缺点使用场景 简单工厂模式例子&#xff1a;优化优缺点适用场景 工厂方法模式 -- 多态工厂的实现例子优缺点优化适用场景 抽象工厂模式 -- 产品族的创建例子优缺点适用场景 总结 创建型模式 单例模式 –…...

链表——超详细

一、无头单向非循环链表 1.结构&#xff08;两个部分&#xff09;&#xff1a; typedef int SLTDataType; typedef struct SListNode {SLTDataType data;//数据域struct SListNode* next;//指针域 }SLNode; 它只有一个数字域和一个指针域&#xff0c;里面数据域就是所存放的…...

【刷题】 leetcode 面试题 08.05.递归乘法

递归乘法 1 题目描述2 思路一&#xff08;返璞归真版&#xff09;3 思路二&#xff08;二进制乘法器版&#xff09;4 思路三&#xff08;变态版&#xff09;Thanks♪(&#xff65;ω&#xff65;)&#xff89;谢谢阅读下一篇文章见&#xff01;&#xff01;&#xff01; 1 题目…...

C语言实现希尔排序算法(附带源代码)

希尔排序 希尔排序&#xff0c;也称递减增量排序算法&#xff0c;是插入排序的一种更高效的改进版本。希尔排序是非稳定排序算法。 希尔排序是基于插入排序的以下两点性质而提出改进方法的&#xff1a; 插入排序在对几乎已经排好序的数据操作时&#xff0c;效率高&#xff0…...

R语言【taxlist】——subset():取taxlist对象的子集

Package taxlist version 0.2.4 Description taxlist对象的子集将通过逻辑操作或模式匹配来完成。子集可以引用包含在插槽taxonNames、taxonRelations或taxonTraits中的信息。 Usage ## S4 method for signature taxlist subset(x,subset,slot "names",keep_child…...

单片机学习笔记---定时器计数器(含寄存器)工作原理介绍(详解篇2)

目录 T1工作在方式2时 T0工作在方式3时 四种工作方式的总结 定时计数器对输入信号的要求 定时计数器对的编程的一个要求 关于初值计算的问题 4种工作方式的最大定时时间的大小 关于编程方式的问题 实例分析 实例1 实例2 T1工作在方式2时 51单片机&#xff0c;有两个…...

《动手学深度学习(PyTorch版)》笔记4.1

注&#xff1a;书中对代码的讲解并不详细&#xff0c;本文对很多细节做了详细注释。另外&#xff0c;书上的源代码是在Jupyter Notebook上运行的&#xff0c;较为分散&#xff0c;本文将代码集中起来&#xff0c;并加以完善&#xff0c;全部用vscode在python 3.9.18下测试通过。…...

OpenAI发布新模型!ChatGPT性能重磅提升,API大幅降价,GPT-4 「变懒」被修复

OpenAI 对ChatGPT进行了大更新&#xff1a;推出了新一代的嵌入模型&#xff0c;对GPT-4 Turbo模型进行了更新&#xff0c;并将很快对GPT-3.5 Turbo的API进行大幅降价&#xff0c;GPT-4「变懒」行为也被修复。 接下来二狗就带大家看看ChatGPT的这次详细更新。 推出新的嵌入模型…...

【C深度解剖】计算机数据下载和删除原理

简介&#xff1a;本系列博客为C深度解剖系列内容&#xff0c;以某个点为中心进行相关详细拓展 适宜人群&#xff1a;已大体了解C语法同学 作者留言&#xff1a;本博客相关内容如需转载请注明出处&#xff0c;本人学疏才浅&#xff0c;难免存在些许错误&#xff0c;望留言指正 作…...

ASTORS国土安全奖:ManageEngine AD360荣获银奖

美国安全今日&#xff08;AST&#xff09;的年度“ASTORS”国土安全奖计划是一个备受瞩目的活动&#xff0c;致力于突显国土安全领域的创新与进步。这一奖项旨在表彰在保护国家免受安全威胁方面做出卓越贡献的个人和组织。该计划汇聚了执法、公共安全和行业领袖&#xff0c;不仅…...

clang--cpplint--gitlint

clang_format clang_format是什么 代码格式化工具 clang_format 官网和官网教程 中文教程 下载 sudo apt install clang sudo apt install clang-format#查看下载是否成功 clang --version 代码的构建到提交的过程&#xff1a; cmake .. make make test make clang_f…...

Web开发8:前后端分离开发

在现代的 Web 开发中&#xff0c;前后端分离开发已经成为了一种常见的架构模式。它的优势在于前端和后端可以独立开发&#xff0c;互不干扰&#xff0c;同时也提供了更好的可扩展性和灵活性。本篇博客将介绍前后端分离开发的概念、优势以及如何实现。 什么是前后端分离开发&am…...

基于 java+springboot+mybatis电影售票网站管理系统前台+后台设计和实现

基于 javaspringbootmybatis电影售票网站管理系统前台后台设计和实现 &#x1f345; 作者主页 央顺技术团队 &#x1f345; 欢迎点赞 &#x1f44d; 收藏 ⭐留言 &#x1f4dd; &#x1f345; 文末获取源码联系方式 &#x1f4dd; &#x1f345; 查看下方微信号获取联系方式 承…...

【INTEL(ALTERA)】错误:*.onchip_flash_0:UFM 扇区不支持“隐藏”模式。请更新访问模式设置

说明 由于英特尔 Quartus Prime Standard Edition 软件版本 22.1 存在一个问题&#xff0c;当您针对 10 FPGA Compact 变体英特尔 MAX在片上闪存英特尔 FPGA IP中选择单压缩映像配置模式时&#xff0c;可能会出现以下错误消息。 错误&#xff1a;*.onchip_flash_0&#xff1a…...

备战蓝桥杯---数据结构与STL应用(基础3)

今天我们主要介绍的是pair,string,set,map pair:我们可以把它当作一个结构体&#xff1a; void solve(){pair<int int> a;//创建amake_pair(1,2);//添加元素cout<<a.first<<endl<<a.second<<endl;}//输出 当然&#xff0c;它也可以嵌套&#…...

「优选算法刷题」:只出现一次的数字Ⅲ

一、题目 给你一个整数数组 nums&#xff0c;其中恰好有两个元素只出现一次&#xff0c;其余所有元素均出现两次。 找出只出现一次的那两个元素。你可以按 任意顺序 返回答案。 你必须设计并实现线性时间复杂度的算法且仅使用常量额外空间来解决此问题。 示例 1&#xff1a; …...

Chapter03-Authentication vulnerabilities

文章目录 1. 身份验证简介1.1 What is authentication1.2 difference between authentication and authorization1.3 身份验证机制失效的原因1.4 身份验证机制失效的影响 2. 基于登录功能的漏洞2.1 密码爆破2.2 用户名枚举2.3 有缺陷的暴力破解防护2.3.1 如果用户登录尝试失败次…...

【HarmonyOS 5.0】DevEco Testing:鸿蒙应用质量保障的终极武器

——全方位测试解决方案与代码实战 一、工具定位与核心能力 DevEco Testing是HarmonyOS官方推出的​​一体化测试平台​​&#xff0c;覆盖应用全生命周期测试需求&#xff0c;主要提供五大核心能力&#xff1a; ​​测试类型​​​​检测目标​​​​关键指标​​功能体验基…...

Golang dig框架与GraphQL的完美结合

将 Go 的 Dig 依赖注入框架与 GraphQL 结合使用&#xff0c;可以显著提升应用程序的可维护性、可测试性以及灵活性。 Dig 是一个强大的依赖注入容器&#xff0c;能够帮助开发者更好地管理复杂的依赖关系&#xff0c;而 GraphQL 则是一种用于 API 的查询语言&#xff0c;能够提…...

Python如何给视频添加音频和字幕

在Python中&#xff0c;给视频添加音频和字幕可以使用电影文件处理库MoviePy和字幕处理库Subtitles。下面将详细介绍如何使用这些库来实现视频的音频和字幕添加&#xff0c;包括必要的代码示例和详细解释。 环境准备 在开始之前&#xff0c;需要安装以下Python库&#xff1a;…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

【Android】Android 开发 ADB 常用指令

查看当前连接的设备 adb devices 连接设备 adb connect 设备IP 断开已连接的设备 adb disconnect 设备IP 安装应用 adb install 安装包的路径 卸载应用 adb uninstall 应用包名 查看已安装的应用包名 adb shell pm list packages 查看已安装的第三方应用包名 adb shell pm list…...

【java】【服务器】线程上下文丢失 是指什么

目录 ■前言 ■正文开始 线程上下文的核心组成部分 为什么会出现上下文丢失&#xff1f; 直观示例说明 为什么上下文如此重要&#xff1f; 解决上下文丢失的关键 总结 ■如果我想在servlet中使用线程&#xff0c;代码应该如何实现 推荐方案&#xff1a;使用 ManagedE…...

触发DMA传输错误中断问题排查

在STM32项目中&#xff0c;集成BLE模块后触发DMA传输错误中断&#xff08;DMA2_Stream1_IRQHandler进入错误流程&#xff09;&#xff0c;但单独运行BLE模块时正常&#xff0c;表明问题可能源于原有线程与BLE模块的交互冲突。以下是逐步排查与解决方案&#xff1a; 一、问题根源…...

Go 并发编程基础:select 多路复用

select 是 Go 并发编程中非常强大的语法结构&#xff0c;它允许程序同时等待多个通道操作的完成&#xff0c;从而实现多路复用机制&#xff0c;是协程调度、超时控制、通道竞争等场景的核心工具。 一、什么是 select select 类似于 switch 语句&#xff0c;但它用于监听多个通…...

设备健康管理的范式革命:中讯烛龙全链路智能守护系统

当工业设备的“亚健康”状态导致隐性产能损失高达23%时&#xff0c;中讯烛龙推出 ​​“感知-诊断-决策-闭环”四位一体解决方案&#xff0c;让设备全生命周期健康管理成为企业增长的隐形引擎。 一、行业痛点&#xff1a;传统运维的三大断层 1. 健康感知盲区 某风电场因无法捕…...