Python 网络爬虫(三):XPath 基础知识

在这里插入图片描述

《Python入门核心技术》专栏总目录・点这里

文章目录

  • 1. XPath简介
  • 2. XPath语法
    • 2.1 选择节点
    • 2.2 路径分隔符
    • 2.3 谓语
    • 2.4 节点关系
    • 2.5 运算符
  • 3. 节点
    • 3.1 元素节点(Element Node)
    • 3.2 属性节点(Attribute Node)
    • 3.3 文本节点(Text Node)
    • 3.4 注释节点(Comment Node)
    • 3.5 父节点(Parent Node)
    • 3.6 子节点(Child Node)
    • 3.7 后一个兄弟节点(Following-sibling Node)
    • 3.8 前一个兄弟节点(Preceding-sibling Node)
  • 4. 轴
    • 4.1 子节点轴(child::)
    • 4.2 父节点轴(parent::)
    • 4.3 后一个兄弟节点轴(following-sibling::)
    • 4.4 前一个兄弟节点轴(preceding-sibling::)
    • 4.5 后代节点轴(descendant::)
    • 4.6 祖先节点轴(ancestor::)
    • 4.7 属性轴(attribute::)
    • 4.8 自身节点轴(self::)
  • 5. 运算符
    • 5.1 位置运算符:
    • 5.2 关系运算符:
    • 5.3 逻辑运算符:
    • 5.4 字符串运算符:
  • 6. 实例
    • 示例1:选择所有链接
    • 示例2:选择特定属性值的元素
    • 示例3:选择文本内容
  • 7. 总结


大家好,我是水滴~~

在进行网络爬虫开发之前,了解XPath是非常重要的。XPath是一种用于在XML和HTML文档中定位和选择节点的语言。本文将详细介绍XPath的基本概念、节点选择、语法规则、轴、运算符,并提供大量的代码示例帮助读者更好地理解和应用XPath。

1. XPath简介

XPath(XML Path Language)是一种用于在XML和HTML文档中导航和定位节点的语言。它是W3C的标准,广泛应用于数据提取、文档解析和网页爬虫等领域。

2. XPath语法

XPath语法用于构建XPath表达式,以选择和定位XML或HTML文档中的节点。以下是XPath语法的基本要点:

2.1 选择节点

  • 使用节点名称选择节点:
//elementName
  • 使用通配符选择所有节点:
//*
  • 使用谓语过滤节点:
//elementName[predicate]

2.2 路径分隔符

  • 使用斜杠(/)表示层级关系:
/parent/child
  • 使用双斜杠(//)表示跨层级选择:
//ancestor/descendant

2.3 谓语

  • 使用方括号([])来进一步过滤节点:
//elementName[predicate]
  • 使用属性和值进行谓语过滤:
//elementName[@attributeName='value']

2.4 节点关系

  • 使用轴(axis)描述节点之间的关系:
axis::node
  • 常用的轴包括:

  • 子节点轴(child::):选择指定元素的所有直接子节点。

  • 父节点轴(parent::):选择指定元素的父节点。

  • 兄弟节点轴(following-sibling::、preceding-sibling::):选择指定元素的后一个或前一个兄弟节点。

  • 属性轴(attribute::):选择指定元素的所有属性节点。

2.5 运算符

  • 位置运算符([n]):选择指定位置的节点。
//elementName[position()]
  • 逻辑运算符(and、or、not):组合表达式或进行条件判断。
//elementName[@attribute1='value1' and @attribute2='value2']
  • 文本运算符:用于匹配文本内容。
//elementName[contains(text(), 'keyword')]

这是XPath语法的基本要点。您可以根据具体需求结合这些规则来构建自己的XPath表达式,以选择和定位所需的节点。

3. 节点

节点是XPath中的基本概念,用于定位和选择XML或HTML文档中的特定部分。以下是XPath中常见的节点类型和相应的示例:

3.1 元素节点(Element Node)

  • 示例:选择所有元素节点
//*
  • 示例:选择特定元素节点
//book

3.2 属性节点(Attribute Node)

  • 示例:选择具有特定属性值的元素节点
//book[@category='fiction']

3.3 文本节点(Text Node)

  • 示例:选择元素节点下的文本内容
//book/title/text()

3.4 注释节点(Comment Node)

  • 示例:选择注释节点
//comment()

3.5 父节点(Parent Node)

  • 示例:选择指定元素节点的父节点
//book/..

3.6 子节点(Child Node)

  • 示例:选择指定元素节点的所有直接子节点
//book/*

3.7 后一个兄弟节点(Following-sibling Node)

  • 示例:选择指定元素节点的后一个兄弟节点
//book/following-sibling::book[1]

3.8 前一个兄弟节点(Preceding-sibling Node)

  • 示例:选择指定元素节点的前一个兄弟节点
//book/preceding-sibling::book[1]

以上示例展示了XPath中不同类型节点的选择方法。您可以根据实际需求和文档结构,使用适当的XPath表达式来选择和定位所需的节点。

4. 轴

XPath轴(Axis)用于描述节点之间的关系,它可以扩展XPath的选择能力。以下是XPath中常用的轴及其示例:

4.1 子节点轴(child::)

  • 示例:选择book元素的所有直接子节点
//book/child::*

4.2 父节点轴(parent::)

  • 示例:选择title元素的父节点(即book元素)
//title/parent::*

4.3 后一个兄弟节点轴(following-sibling::)

  • 示例:选择title元素的后一个兄弟节点(即author元素)
//title/following-sibling::*

4.4 前一个兄弟节点轴(preceding-sibling::)

  • 示例:选择title元素的前一个兄弟节点(如果存在)
//title/preceding-sibling::*

4.5 后代节点轴(descendant::)

  • 示例:选择book元素的所有后代元素节点
//book/descendant::*

4.6 祖先节点轴(ancestor::)

  • 示例:选择title元素的所有祖先元素节点
//title/ancestor::*

4.7 属性轴(attribute::)

  • 示例:选择book元素的所有属性节点
//book/attribute::*

4.8 自身节点轴(self::)

  • 示例:选择当前节点(例如,选择当前元素节点)
//self::node()

这些轴可以与其他XPath语法结合使用,以更精确地选择和定位所需的节点。根据文档结构和需要,选择适当的轴来构建XPath表达式。

5. 运算符

XPath运算符用于在XPath表达式中执行比较、逻辑和算术操作。以下是XPath中常用的运算符:

5.1 位置运算符:

  • [n]:选择节点集中的第n个节点。
//book[2]  //选择第二个book节点

5.2 关系运算符:

  • =:检查两个值是否相等。
//title[text() = 'Harry Potter']  //选择文本内容为"Harry Potter"的title节点
  • !=:检查两个值是否不相等。
//book[author != 'John Doe']  //选择author不是"John Doe"的book节点
  • <><=>=:执行数值或字符串的比较。
//price > 20  //选择价格大于20的节点

5.3 逻辑运算符:

  • and:逻辑与运算符,两个条件都满足时返回true。
//book[price > 20 and category = 'fiction']  //选择价格大于20且类别为"fiction"的book节点
  • or:逻辑或运算符,两个条件满足其一时返回true。
//book[price > 20 or category = 'fiction']  //选择价格大于20或类别为"fiction"的book节点
  • not:逻辑非运算符,取反操作。
//book[not(price > 20)]  //选择价格不大于20的book节点

5.4 字符串运算符:

  • concat():将多个字符串连接起来。
concat('Hello', 'World')  //返回"HelloWorld"
  • contains():检查一个字符串是否包含另一个字符串。
contains(title, 'Potter')  //选择title中包含"Potter"的节点
  • starts-with():检查一个字符串是否以指定的前缀开始。
starts-with(title, 'Harry')  //选择title以"Harry"开头的节点
  • ends-with():检查一个字符串是否以指定的后缀结束。
ends-with(title, 'Potter')  //选择title以"Potter"结尾的节点

这些运算符可以在XPath表达式中使用,以执行比较、逻辑和算术操作,从而选择和定位所需的节点。根据具体的需求,选择适当的运算符来构建XPath表达式。

6. 实例

为了更好地理解XPath的应用,以下是一些具体的实例:

示例1:选择所有链接

假设我们有一个HTML文档,其中包含多个链接。我们可以使用XPath选择所有的链接元素。

<!DOCTYPE html>
<html>
<body>
  <div>
    <a href="https://www.example.com">Link 1</a>
    <a href="https://www.example.com">Link 2</a>
    <a href="https://www.example.com">Link 3</a>
  </div>
</body>
</html>

XPath表达式示例:

//a   //选择所有<a>元素节点

示例2:选择特定属性值的元素

假设我们有一个XML文档,其中包含多个元素,每个元素都有一个category属性。我们可以使用XPath选择具有特定属性值的元素。

<library>
  <book category="fiction">Book 1</book>
  <book category="non-fiction">Book 2</book>
  <book category="fiction">Book 3</book>
</library>

XPath表达式示例:

//book[@category='fiction']   //选择category属性值为"fiction"的所有<book>元素节点

示例3:选择文本内容

假设我们有一个XML文档,其中包含多个元素,每个元素都有一个子元素用于表示书籍的标题。我们可以使用XPath选择所有元素下的标题文本内容。

<library>
  <book>
    <title>Book 1</title>
  </book>
  <book>
    <title>Book 2</title>
  </book>
</library>

XPath表达式示例:

//book/title/text()   //选择所有<book>元素下的<title>文本内容

7. 总结

本文简要介绍了XPath的基本概念、节点选择、语法规则、轴和运算符。XPath是爬虫开发中非常重要的一部分,可以帮助我们准确定位和提取所需的数据。通过学习XPath的基本知识和实际应用,您将能够更加灵活和高效地开发网络爬虫。希望本文对您的学习和实践有所帮助!如有任何问题,请随时向我提问。

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

深入理解Zookeeper系列-4.Watcher原理

&#x1f44f;作者简介&#xff1a;大家好&#xff0c;我是爱吃芝士的土豆倪&#xff0c;24届校招生Java选手&#xff0c;很高兴认识大家&#x1f4d5;系列专栏&#xff1a;Spring源码、JUC源码、Kafka原理、分布式技术原理&#x1f525;如果感觉博主的文章还不错的话&#xff…

华为云之一键安装宝塔面板

华为云之一键安装宝塔面板 一、本次实践介绍1.1 实践环境简介1.2 本次实践目的 二、宝塔面板介绍三、环境准备工作3.1 预置实验环境3.2 查看环境信息3.3 登录华为云3.4 查看弹性云服务器状态3.5 ssh登录弹性云服务器3.6 查看操作系统版本 四、安装宝塔面板4.1 一键部署宝塔面板…

备战春招——12.04 算法

哈希表 哈希表主要是使用 map、unordered_map、set、unorerdered_set、multi_&#xff0c;完成映射操作&#xff0c;主要是相应的函数。map和set是有序的&#xff0c;使用的是树的形式&#xff0c;unordered_map和unordered_set使用的是散列比表的&#xff0c;无序。 相应函数…

[Android] c++ 通过 JNI 调用 JAVA函数

如何使用&#xff1a; Calling Java from C with JNI - CodeProject c里的 JNI 类型 和 JAVA 类型的映射关系&#xff1a; JNI Types and Data Structures Primitive Types and Native Equivalents Java TypeNative TypeDescriptionbooleanjbooleanunsigned 8 bitsbytejbyt…

Redis Desktop Manager for Mac:高效管理Redis数据的必备工具

Redis是一种快速、可扩展的内存数据库&#xff0c;被广泛应用于缓存、消息队列和实时分析等领域。而Redis Desktop Manager for Mac作为一款专为Mac用户设计的Redis桌面管理工具&#xff0c;为用户提供了高效便捷的方式来管理和操作Redis数据。 首先&#xff0c;Redis Desktop…

fastadmin权限树。树形下拉框

fastadmin 笔记 权限树 在构造方法中编写相应的代码 值得一提的是&#xff0c;你的表必须有 id 字段以及 pid 字段。 // 必须将结果集转换为数组$ruleList \think\Db::name("state_list")->field(createtime,updatetime, true)->order(id ASC)->select();…

【文末送书】Python OpenCV从入门到精通

文章目录 &#x1f354;简介opencv&#x1f339;内容简介&#x1f6f8;编辑推荐&#x1f384;导读&#x1f33a;彩蛋 &#x1f354;简介opencv OpenCV&#xff08;Open Source Computer Vision Library&#xff09;是一个开源的计算机视觉库&#xff0c;提供了丰富的图像处理和…

和田夜市,一个让人流连忘返的“深夜食堂”

11月26日晚&#xff0c;华灯初上&#xff0c;和田夜市热闹非凡&#xff0c;来自天南海北的游客汇聚于此&#xff0c;各种勾人味蕾的风味小吃&#xff0c;令人目不暇接。 和田夜市由来已久&#xff0c;晚上逛夜市已成为和田人的一种生活方式&#xff0c;因此这里也最能体现和田人…

webpack学习-1.起步

webpack学习-1.起步 1.基础设置2.配置文件的引入3.总结 1.基础设置 首先 webpack是干嘛的呢&#xff0c;用官网的一张图 Webpack 是一个现代的静态模块打包工具。它主要用于将前端应用程序中的各种资源&#xff08;例如 JavaScript、CSS、图片等&#xff09;打包成一个或多个…

【Axure高保真原型】3D大屏可视化模板

今天和大家分享3D大屏可视化的原型模板&#xff0c;里面包括3D条形图、3D柱状图、3D饼图、3D环形图、3D金字塔图&#xff0c;鼠标移入图表&#xff0c;对应区域会高亮变色&#xff0c;并且显示对应的数据标签&#xff0c;具体效果可以点击下方视频观看或打开下方预览地址查看哦…

Windows server 2019 域环境部署

环境准备 准备3台服务器&#xff0c;配置都是8g2核&#xff0c;50g硬盘&#xff0c;操作系统版本Windows Server 2019 Datacenter 域服务器&#xff1a;adc&#xff0c;192.168.56.120服务器1&#xff1a;server1:&#xff0c;192.168.56.121服务器2&#xff1a;server2&…

InsCode实践分享

在当今信息爆炸的时代&#xff0c;如何从海量信息中脱颖而出&#xff0c;获取更多的关注和认可&#xff0c;成为了许多人的共同追求。作为知乎平台上的优质用户&#xff0c;我愿意分享一些自己的经验和技巧&#xff0c;帮助大家更好地运用InsCode&#xff0c;实现个人成长和进步…

9、web安全综述

文章目录 一、web核心组成二、web架构2.1 Web服务器2.2 Web容器2.3 Web服务端语言2.4 web开发框架2.6 软件系统 三、常见web安全漏洞3.1 信息泄露3.2 目录遍历3.3 跨站脚本攻击&#xff08;XSS&#xff09;3.4 SQL注入漏洞3.5 文件上传漏洞3.6 命令执行漏洞3.7 文件包含漏洞 一…

nginx的反向代理和负载均衡

nginx的反向代理和负载均衡&#xff1a; 代理&#xff1a;客户端通过一个指定的服务器&#xff0c;访问其他服务器&#xff0c;请求和响应都由指定服务器来为客户端进行处理&#xff0c;这个指定的服务器就是代理服务器 代理的方式&#xff1a; 四层代理&#xff1a;四层就是…

MacOS 14 系统 XCode15、 Flutter 开发 IOS

Flutter 系列文章目录 MacOS14 Sonoma 安装 Flutter 开发环境 MacOS 系统 Flutter开发Android 环境配置MacOS 系统 Flutter开发IOS 环境配置​​​​​​​ 前言 前面我们已经在MacOS14 M3芯片上安装好 Flutter环境&#xff0c;包括开发工具 VsCode 、Android Stuiod,那么fl…

封装时间轴组件 timeline

要求时间轴的点展示进度百分比&#xff0c;线也根据进度不同展示不同长度的颜色 实现效果&#xff1a; 使用的组件库是vant的circle 子组件&#xff1a; <template><div class"m-timeline-area" :style"width: ${width}px"><div class&qu…

0年费、0月费、免kyc,支持ChatGPTPlus充值虚拟卡

虚拟卡通常是指银行卡的虚拟卡&#xff0c;是在银行卡的基础上的银联、VISA、万事达卡BIN码衍生出的一种虚拟账户。虚拟卡一般都是用于网络上无卡支付&#xff0c;因此虚拟卡都不会配备相应的实体卡片。银行卡的虚拟卡&#xff0c;在分类上与实体卡并无什么区别&#xff0c;也分…

如何在uniapp中使用uviewUI-适合uniapp的ui组件

文章目录 1、如果使用的是npm方式2、如果是用Hbuilder X导入3、通用步骤4、使用5、可以适配微信小程序 前文说了uniapp能用哪些前端框架&#xff0c;今天来推荐uview。其最新版为2.0.36。最近一次更新日期&#xff1a;2023-03-27。 uView是uni-app生态专用的UI框架&#xff0c…

2023.12.4 GIT的概念和组成

目录 1.git的介绍 2.git的历史 开发者&#xff1a;Linus Torvalds Linux的创始人 3.git和svn的对比 svn:集中式管理 git:分布式管理 4.git管理的组成结构 1.git的介绍 git是项目版本管理工具,能自动的将多个版本进行管理存储,类似于快照,多个人共享版本 git的诞生:分布式…

Android 架构实战MVI进阶

MVI架构的原理和流程 MVI架构是一种基于响应式编程的架构模式&#xff0c;它将应用程序分为四个核心组件&#xff1a;模型&#xff08;Model&#xff09;、视图&#xff08;View&#xff09;、意图&#xff08;Intent&#xff09;和状态&#xff08;State&#xff09;。 原理&…