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>]

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

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

相关文章

初识人工智能,一文读懂机器学习之逻辑回归知识文集(6)

&#x1f3c6;作者简介&#xff0c;普修罗双战士&#xff0c;一直追求不断学习和成长&#xff0c;在技术的道路上持续探索和实践。 &#x1f3c6;多年互联网行业从业经验&#xff0c;历任核心研发工程师&#xff0c;项目技术负责人。 &#x1f389;欢迎 &#x1f44d;点赞✍评论…

指针深入了解7

1.qsort的模拟实现&#xff08;冒泡排序的原型制作&#xff09; 1.排序整型 int cmp_int(const void* p1, const void* p2) {return *((int*)p1) - *((int*)p2); } void swap(char* p1, char* p2)//完成交换 {int tmp *p1;*p1 *p2;*p2 tmp;} void bubble_sort(void* base,…

Django框架——第一个Django程序

大家好&#xff0c;在很久之前&#xff0c;我写了一系列关于Flask框架的文章&#xff0c;得到了不错的反馈&#xff0c;这次我打算写一系列关于Django框架的文章&#xff0c;希望大家多多支持&#xff0c;多给一些写作意见。 Django Django是用Python语言编写的开源web应用框…

matlab自定义函数实现图像小波变换

matlab中提供了小波变换函数lwt和ilwt&#xff0c;可以方便地实现提升小波变换。 我们按照小波变换的定义&#xff0c;粗糙地实现一个针对图像的小波变换&#xff0c;如下&#xff1a; % 使用方法&#xff1a; img imread(lena256.bmp); % 假设lena.png是灰度图像 subplot(2…

上门服务系统|如何搭建一款高质量的上门服务软件

预约上门系统源码开发是一项复杂而有挑战性的任务&#xff0c;但也是实现智能化预约服务的关键一步。通过自主开发预约上门系统的源码&#xff0c;企业可以完全定制系统的功能、界面和安全性&#xff0c;从而为用户提供更高效、便捷、个性化的预约体验。本文将带你深入了解预约…

S275智慧煤矿4G物联网网关:矿山开采的未来已来

随着经济发展煤矿需求不断激增&#xff0c;矿山矿井普遍处于偏远山区&#xff0c;生产管理、人员安全、生产效率是每个矿山矿井都需要考虑的问题&#xff0c;利用网关对现场终端设备连接组网&#xff0c;实现智慧煤矿远程管理。 各矿山矿井分布范围比较广泛&#xff0c;户外环…

(学习日记)2024.01.27

写在前面&#xff1a; 由于时间的不足与学习的碎片化&#xff0c;写博客变得有些奢侈。 但是对于记录学习&#xff08;忘了以后能快速复习&#xff09;的渴望一天天变得强烈。 既然如此 不如以天为单位&#xff0c;以时间为顺序&#xff0c;仅仅将博客当做一个知识学习的目录&a…

GNU链接脚本的MEMORY命令解析

1、GUN中对MEMORY指令的描述 《GUN的官网描述》 2、MEMORY命令的格式 MEMORY{name [(attr)] : ORIGIN origin, LENGTH len…}实例&#xff1a; MEMORY {/* 描述设备的内存区域 */rom (rxa) : ORIGIN 0x80000000, LENGTH 512Kram (wxa) : ORIGIN 0x80080000, LENGTH 51…

ElementUI 组件:Container 布局容器实例

ElementUI安装与使用指南 Container 布局容器 点击下载learnelementuispringboot项目源码 效果图 项目里el-container-example.vue代码 <script> export default {name: el_container_example,data() {const item {date: 2024-01-31,name: 国龙,address: 上海市某区…

并网逆变器学习笔记8---平衡桥(独立中线模块)控制

参考文献&#xff1a;《带独立中线模块的三相四线制逆变器中线电压脉动抑制方法》---赵文心 一、独立中线模块的三相四线拓扑 独立中线模块是控制中线电压恒为母线一半&#xff0c;同时为零序电流ineu提供通路。不平衡负载的零序电流会导致中线电压脉动&#xff0c;因此需要控制…

力扣hot100 分割回文串 集合 dfs

Problem: 131. 分割回文串 文章目录 思路Code&#x1f496; DP预处理版 思路 &#x1f468;‍&#x1f3eb; 参考题解 Code import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Deque; import java.util.List;public class Solution {int n;//字符…

卷子怎么扫描成电子版?试试这些软件

卷子怎么扫描成电子版&#xff1f;随着科技的进步&#xff0c;越来越多的纸质文档正在被数字化所取代。如果你手头有一份纸质试卷&#xff0c;想要将其转化为电子版&#xff0c;却不知道该如何操作&#xff0c;那么今天我们将为你介绍5款软件&#xff0c;让你轻松实现这一目标。…

探索美颜技术:美颜SDK是什么?

今天&#xff0c;笔者将于大家一同探讨美颜技术&#xff0c;重点聚焦于美颜SDK的定义、工作原理以及在不同领域的应用&#xff0c;以期为读者带来一场有关美颜技术背后秘密的深度探索。 一、什么是美颜SDK&#xff1f; 美颜SDK是一套旨在为开发者提供美颜算法和功能的工具包。…

安卓主板_紫光展锐T820安卓主板方案定制

安卓主板采用了性能强劲的紫光展锐T820八核处理器&#xff0c;搭载了Android 13系统&#xff0c;为用户带来更加顺畅的操作体验。该主板不仅采用了6nm工艺&#xff0c;更加强大的算力和优越的性能&#xff0c;能够轻松实现多任务运行&#xff0c;不会出现卡顿现象。 此外&#…

和朋友随时随地玩——幻兽帕鲁服务器极简部署流程

什么是游戏服务器&#xff1f;通俗来说就是一个公共的电脑&#xff0c;玩家可以在任意时刻进入服务器游玩&#xff0c;不需要等待某个玩家创建房间&#xff0c;即可任意在一个世界一起游戏 本文将为您提供极简部署幻兽帕鲁服务器的指引&#xff0c;「仅需轻点三次鼠标&#xff…

计算机设计大赛 深度学习 python opencv 动物识别与检测

文章目录 0 前言1 深度学习实现动物识别与检测2 卷积神经网络2.1卷积层2.2 池化层2.3 激活函数2.4 全连接层2.5 使用tensorflow中keras模块实现卷积神经网络 3 YOLOV53.1 网络架构图3.2 输入端3.3 基准网络3.4 Neck网络3.5 Head输出层 4 数据集准备4.1 数据标注简介4.2 数据保存…

Kafka 记录

推荐资源 官网http://kafka.apache.org/Githubhttps://github.com/apache/kafka书籍《深入理解Kafka 核心设计与实践原理》 Kafka 架构 Kafka使用ZooKeeper作为其分布式协调框架&#xff0c;其动态扩容是通过ZooKeeper来实现的。Kafka使用Zookeeper保存broker的元数据和消费者信…

cesium-加载地形图

废话不多说 直接代码 <template><div id"cesiumContainer" style"height: 100vh;"></div><div id"toolbar" style"position: fixed;top:20px;left:220px;"><el-breadcrumb><el-breadcrumb-item>…

第3章-python深度学习——(波斯美女)

第3章 神经网络入门 本章包括以下内容&#xff1a; 神经网络的核心组件 Keras 简介 建立深度学习工作站 使用神经网络解决基本的分类问题与回归问题 本章的目的是让你开始用神经网络来解决实际问题。你将进一步巩固在第 2 章第一个示例中学到的知识&#xff0c;还会将学到的…

外汇监管牌照解析:确保交易安全与合规性

外汇交易中&#xff0c;资金安全与平台监管是大家最关心的话题。监管是评估外汇经纪商是否值得信赖、是否具备相关资质的关键依据&#xff0c;因此选择一家拥有海外合法监管的经济商至关重要。 那么&#xff0c;今天我们就来聊聊全球权威的几大监管机构 — FCA、ASIC、NFA、FSA…