【scrapy】3.XPath解析

目录

一、XPath介绍

1.基本介绍

2.HTML树状结构图

3.节点之间的关系

(1)Xpath中的绝对路径与相对路径

二、XPath的语法介绍

1.元素属性定位

1.1 根据属性名定位元素:

1.2 根据属性名和属性值定位元素:

1.3 根据部分属性值定位元素:

1.4 根据多个属性进行定位:

2.层级属性结合定位

2.1定位父元素下的子元素:

2.2 定位特定属性的父元素下的子元素:

2.3定位特定属性的父元素下的特定属性的子元素:

3.使用谓语定位

3.1定位符合特定索引的元素:

3.1定位满足特定属性条件的元素:

3.3结合多个条件定位元素:

3.4通过文本内容定位元素:

4.使用逻辑运算符定位

4.1 使用 and 运算符:

4.2 使用 or 运算符:

4.3 使用 not 运算符:

5.使用文本定位

5.1定位文本内容相等的元素:

5.2定位包含指定文本内容的元素:

5.3根据包含特定关键词的文本内容定位元素:

6.使用部分函数定位

三、XPath语法验证

四、lxml的基本使用


一、XPath介绍

1.基本介绍

XPath(XML Path Language)是一种XML的查询语言,他能在XML树状结构中寻找节点。XPath 用于在 XML 文档中通过元素和属性进行导航

xml是一种标记语法的文本格式,xpath可以方便的定位xml中的元素和其中的属性值。lxml是python中的一个第三方模块,它包含了将html文本转成xml对象,和对对象执行xpath的功能

2.HTML树状结构图

3.节点之间的关系

Xpath 中的绝对路径从 HTML 根节点开始算,相对路径从任意节点开始。通过开发者工具,我们可以拷贝到 Xpath 的绝对路径和相对路径代码:

绝对路径

#从根节点/html开始往下,一层层的表示 出来直到需要的节点为止。

/html/body/div[1]/div[2]/div[6]/div/div/div[2]/div/div[1]/div/div[1]/div/div/ul/li[1]/a/span[1]

相对路径

#以“//”开头。可以从任意节点开始,一般选取一个可以唯一定位到的元素开始写

//*[@id="title-content"]/span[1]

但是由于拷贝出来的代码缺乏灵活性,也不全然准确。大部分情况下,都需要自己定义 Xpath 语句。

二、XPath的语法介绍

表达式说明举例
/从根节点开始选取/html/div/span
//从任意节点开始选取//*[@id="kw"]
.选取当前节点
..选取当前节点的父节点//input/..       #会选取 input 的父节点
@选取属性或者根据属性选取

//input[@data]     #选取具备 data 属性的 input 元素

//@data           #选取所有 data 属性

*通配符,表示任意节点或任意属性

路径表达式描述
bookstore选取bookstore元素的所有子节点
/bookstore选取根元素bookstore,假如路径起始于“/”,则此路径始终代表到元素的绝对路径
//bookstore选取属于bookstore的子元素的所有book元素
bookstore/book选取所有book子元素,而不管它们在文档中的位置
//book选择属于bookstore元素的后代的任意位置的所有book元素
//@lang选取名为lang的所有属性

1.元素属性定位

1.1 属性名定位元素:

        定位具有特定属性名的元素://*[@attribute_name]

        示例://*[@class] 会匹配所有具有 "class" 属性的元素。

1.2 属性名和属性值定位元素:

        定位具有特定属性名和属性值的元素://*[@attribute_name='value']

        示例://*[@id='myElement'] 会匹配 id 属性值为 "myElement" 的元素。

1.3 部分属性值定位元素:

        定位具有属性值包含特定文本的元素://*[contains(@attribute_name,'value')]

        示例://*[contains(@class,'active')] 会匹配 class 属性值包含 "active" 的元素。

1.4 多个属性进行定位:

        定位具有多个属性及其对应值的元素://*[@attribute_name_1='value_1' and   @attribute_name_2='value_2']

        示例://*[@class='active' and @data-type='button'] 会匹配同时具有 class 属性值为         "active" 和 data-type 属性值为 "button" 的元素

2.层级属性结合定位

2.1定位父元素下的子元素:

   //父元素名/子元素名:通过指定父元素和子元素的标签名来定位元素。

2.2 定位特定属性的父元素下的子元素:

  //父元素名[@属性名='属性值']/子元素名   

通过指定父元素的属性和属性值,再结合子元素的标签名来定位元素。

示例://div[@class='container']/p   

会匹配 class 属性为 "container" 的 <div> 元素下的所有 <p> 元素。

2.3定位特定属性的父元素下的特定属性的子元素:

   //父元素名[@属性名1='属性值1']/子元素名[@属性名2='属性值2']:通过指定父元素和子元素的属性条件来定位元素。

示例://ul[@id='menu']/li[@class='active']

会匹配 id 属性为 "menu" 的 <ul> 元素下,class 属性为 "active" 的所有 <li> 元素。

3.使用谓语定位

谓语用来查找某个特定的节点或者包含某个指定的值的节点,谓语被嵌在方括号中。

3.1定位符合特定索引的元素:

   //tagname[position()]:通过位置索引来定位元素。索引从 1 开始。

   示例://ul/li[position() = 3] 可以匹配位于 <ul> 下的第三个 <li> 元素。

3.1定位满足特定属性条件的元素:

    //tagname[@attribute='value']:通过属性条件来定位元素。

   示例://input[@type='text'] 可以匹配所有 type 属性值为 "text" 的 <input> 元素。

3.3结合多个条件定位元素:

    //tagname[@attribute1='value1' and @attribute2='value2']:使用逻辑运算符 and 结合多个属性条件来定位元素。

    示例://a[@class='active' and @href='/home'] 可以匹配同时满足 class 属性值为 "active" 和 href 属性值为 "/home" 的 <a> 元素。

3.4通过文本内容定位元素:

    //tagname[text()='value']:通过文本内容来定位元素。

    示例://h1[text()='Welcome']

可以匹配文本内容为 "Welcome" 的 <h1> 元素。

4.使用逻辑运算符定位

使用逻辑运算符定位是XPath中一种灵活的定位技术,允许您结合多个条件来定位元素。XPath支持以下三种逻辑运算符:and、or、not。以下是使用逻辑运算符定位元素的示例:

4.1 使用 and 运算符:

//tagname[@attribute1='value1' and @attribute2='value2']:通过结合多个属性条件,使用 and 运算符定位元素。

示例://input[@type='text' and @name='username'] 可以匹配type属性为"text"且name属性为"username"的input元素。

4.2 使用 or 运算符:

//tagname[@attribute='value1' or @attribute='value2']:通过结合多个属性条件,使用 or 运算符定位元素。

示例://a[@class='active' or @class='highlight'] 可以匹配class属性为"active"或"class"属性为"highlight"的a元素。

4.3 使用 not 运算符:

//tagname[not(@attribute='value')]:使用 not 运算符否定一个属性条件,定位不满足该条件的元素。

示例://div[not(@class='header')] 可以匹配class属性不为"header"的div元素

5.使用文本定位

5.1定位文本内容相等的元素:

//tagname[text()='value']:匹配文本内容与指定值相等的元素。

示例://a[text()='Login'] 可以匹配文本为"Login"的所有 <a> 元素。

5.2定位包含指定文本内容的元素:

//tagname[contains(text(),'value')]:匹配包含指定值的文本内容的元素。

示例://p[contains(text(),'Lorem ipsum')] 可以匹配包含"Lorem ipsum"文本的所有 <p> 元素。

5.3根据包含特定关键词的文本内容定位元素:

//tagname[contains(text(),'keyword')]:匹配文本内容中包含特定关键词的元素。

示例://h2[contains(text(),'Contact')] 可以匹配文本内容中包含"Contact"关键词的 <h2> 元素

6.使用部分函数定位

函数

说明举例
contains(a,b)选取属性或者文本包含某些字符//div[contains(@id, 'data')] 选取 id 属性包含 data 的 div 元素
start-with(a,b)选取属性或者文本以某些字符开头//div[starts-with(@id, 'data')] 选取 id 属性以 data 开头的 div 元素
end-with(a,b) 选取属性或者文本以某些字符结尾//div[ends-with(@id, 'require')] 选取 id 属性以 require 结尾的 div 元素


                        

三、XPath语法验证

(1)在开发者工具的 Elements 中按Ctrl + F,在搜索框中输入 Xpath

(2)打开开发者工具并切换到Console(控制器),在Console中输入$x('具体的XPath')并回车执行

四、lxml的基本使用

lxml是一个HTML/XML的解析器,主要的功能是解析和提取HTML/XML数据

lxml和正则一样,也是用C语言实现的,可以利用之前学习的XPath语法,来快速的定位元素及节点信息。

# 导入模块
from lxml import etree
# html源代码
web_data = """
        <div>
            <ul>
                 <li class="item-0"><a href="link1.html">first item</a></li>
                 <li class="item-1"><a href="link2.html">second item</a></li>
                 <li class="item-inactive"><a href="link3.html">third item</a></li>
                 <li class="item-1"><a href="link4.html">fourth item</a></li>
                 <li class="item-0"><a href="link5.html">fifth item</a>
             </ul>
         </div>
        """
# 将html转成xml文件
element = etree.HTML(web_data)
# print(element)
# 获取li标签下面的a标签的href
links = element.xpath('//ul/li/a/@href')
print(links)
# 获取li标签下面的a标签的文本数据
result = element.xpath('//ul/li/a/text()')
print(result)

注:

  • '//ul/li/a/@href':选择并返回<a>标签的href属性值,返回一个字符串列表。
  • '//ul/li/a[href]':选择并返回包含href属性的<a>标签元素,返回一个元素列表(Element对象)。
  • '//ul/li/a/text()':获取<a>标签的文本内容。

参考:数据解析之Xpath解析(超详细定位)-CSDN博客

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

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

相关文章

C语言力扣刷题1——最长回文字串[双指针]

力扣算题1——最长回文字串[双指针] 一、博客声明二、题目描述三、解题思路1、思路说明2、知识补充a、malloc动态内存分配b、free释放内存c、strlen求字符数组长度d、strncpy函数 四、解题代码&#xff08;附注释&#xff09; 一、博客声明 找工作逃不过刷题&#xff0c;为了更…

Swagger与RESTful API

1. Swagger简介 在现代软件开发中&#xff0c;RESTful API已成为应用程序间通信的一个标准。这种架构风格通过使用标准的HTTP方法来执行网络上的操作&#xff0c;简化了不同系统之间的交互。API&#xff08;应用程序编程接口&#xff09;允许不同的软件系统以一种预定义的方式…

一键进阶ComfyUI!懂AI的设计师现在都在用的节点式Stable Diffusion

前言 _ 万字教程&#xff01;奶奶看了都会的 ComfyUI 入门教程 推荐阅读 一、川言川语 大家好&#xff0c;我是言川。 阅读文章 > ](https://www.uisdc.com/comfyui-3) 目前使用 Stable Diffusion 进行创作的工具主要有两个&#xff1a;WebUI 和 ComfyUI。而更晚出现的…

2000—2022年青藏高原遥感生态指数数据集

该数据集是基于多套MODIS数据集&#xff0c;选取NDVI、LST、WET、NDBSI四项指标&#xff0c;采用主成分分析法&#xff0c;生成2000-2022年500米空间分辨率的遥感生态指数&#xff08;RSEI&#xff09;数据集。 遥感生态指数&#xff1a;是一种基于遥感技术的生态环境质量综合评…

容联云容犀Desk在线客服:全渠道+全场景+全智能辅助,提升客户体验

如今&#xff0c;客户体验已经从基础的对话、交易、业务办理&#xff0c;转变为深度的生活联结、情感共鸣、价值认可。客户期待的转变&#xff0c;也让更多企业越发重视“以客户为中心”的业务增长战略。 容犀Desk营销服统一体验工作空间应运而生&#xff0c;其核心能力在线客…

wsl ubuntu 安装Anaconda3步骤

如何在Ubuntu上安装Anaconda3呢?本章记录整个安装过程。 1、下载脚本 https://mirrors.bfsu.edu.cn/anaconda/archive/Anaconda3-2023.09-0-Linux-x86_64.sh 下载之后,将脚本上传到Ubuntu里。 2、安装脚本 bash Anaconda3-2021.11-Linux-x86_64.sh根据提示进行安装,提示输…

React:tabs或标签页自定义右击菜单内容,支持内嵌iframe关闭菜单方案

React&#xff1a;tabs或标签页自定义右击菜单内容&#xff0c;支持内嵌iframe关闭菜单方案 不管是react、vue还是原生js&#xff0c;原理是一样的。 注意如果内嵌iframe情况下&#xff0c;iframe无法使用事件监听&#xff0c;但是可以使用iframe的任何点击行为都会往父级wind…

【等保】网络安全等级保护(等保2.0PPT)

等保2.0&#xff08;网络安全等级保护基本要求的第二代标准&#xff09;的推出和实施&#xff0c;是基于多方面的考虑和需求。以下是实施等保2.0的主要原因&#xff1a; 加强网络安全保护&#xff1a; 随着网络技术的不断发展和网络威胁的不断增加&#xff0c;传统的网络安全保…

BGP中的TCP连接源地址问题

3.TCP连接源地址&#xff08;用loop back地址是最优选择&#xff09; 应用场景与理论&#xff1a; 由于BGP应用于大型网络中&#xff0c;为了避免单点失败&#xff0c;往往需要通过多条链路连接&#xff0c;当一条链路故障时候就用另一条链路继续工作&#xff0c;但是BGP又无法…

Swift 6:导入语句上的访问级别

文章目录 前言示例启用 AccessLevelOnImport破坏性变更采用这些更改总结前言 SE-0409 提案引入了一项新功能,即允许使用 Swift 的任何可用访问级别标记导入声明,以限制导入的符号可以在哪些类型或接口中使用。由于这些变化,现在可以将依赖项标记为对当前源文件(private 或…

IO-Link软件开发流程

目录 了解IO-Link协议&#xff1a; 确定物理连接方式&#xff1a; 编写驱动程序&#xff1a; 测试通信&#xff1a; 集成与应用&#xff1a; 优化与迭代&#xff1a; 文档编写与用户支持&#xff1a; IO-Link产品的开发流程主要包括以下几个步骤 了解IO-Link协议&#x…

【java实习评审】 项目详情模块,如何设计关联表,提高查询性能

大家好&#xff0c;本篇文章分享一下【校招VIP】免费商业项目“推评分16”第一期电影详情模块 java同学的文档周最佳作品。 1、本项目是基于年轻人的喜好&#xff0c;更个性的电影推荐网站。筛选各分类的知名电影&#xff0c;并给出推荐理由和下载链接。另外&#xff0c;通过…

泰迪智能科技实验室产品-云计算资源管理平台介绍

云计算资源管理平台是一款集群应用程序管理平台&#xff0c;以Docker、Kubernetes为核心引擎的容器化应用部署、运行环境&#xff0c;对数据中心的物理服务器、网络、存储、虚拟服务器等基础架构资源进行集中统一的管理、分配、监控等。平台旨在围绕行业应用逐步由“虚拟化”向…

Docker部署前端,动态配置后端地址

本文介绍了使用Docker环境变量动态配置nginx。采用的是通过docker run -e xxxxxxx先往容器注入环境变量&#xff0c;然后进一步通过envsubst指令将环境变量写入到conf文件中&#xff0c;实现动态配置文件内容。 背景 前后端分离的架构下&#xff0c;经常会用到nginx反向代理来…

深度学习 --- stanford cs231学习笔记七(训练神经网络之梯度下降优化器)

5&#xff0c;梯度下降优化器 5&#xff0c;1 梯度下降在深度学习中的作用 在深度学习中&#xff0c;权重W的值是否合理是由损失函数L来判断的。L越小&#xff0c;表示W的设置越happy。L越大&#xff0c;表示W的值越unhappy。 为了让L越来越小&#xff0c;常用的方法是梯度下降…

自主可控的芯片设计供应链软件:保障芯片产业安全的关键

在当前的科技浪潮中&#xff0c;芯片作为信息技术的核心&#xff0c;其设计、制造和供应链的安全性和自主可控性显得尤为重要。而自主可控的芯片设计供应链软件&#xff0c;正是保障这一产业链安全的关键环节。 首先&#xff0c;我们要明确自主可控芯片设计供应链软件的核心价值…

【强化学习】第02期:动态规划方法

笔者近期上了国科大周晓飞老师《强化学习及其应用》课程&#xff0c;计划整理一个强化学习系列笔记。笔记中所引用的内容部分出自周老师的课程PPT。笔记中如有不到之处&#xff0c;敬请批评指正。 文章目录 2.1 动态规划&#xff1a;策略收敛法/策略迭代法2.2 动态规划&#xf…

聚星文社AI工具

聚星文社AI工具是一种基于人工智能技术开发的工具&#xff0c;旨在辅助作者和写作人员提升创作效率和质量。 点击下载 该工具可以提供多项功能&#xff0c;包括语法纠错、智能推荐、文章自动摘要等。 通过使用聚星文社AI工具&#xff0c;用户可以在写作过程中得到即时的纠错建…

数据库使用笔记

1.mysql数据库频繁访问导致连接超时 解决办法一&#xff1a; 优化查询&#xff1a;检查并优化SQL查询语句&#xff0c;减少不必要的数据库调用。增加连接池大小&#xff1a;如果应用程序使用连接池&#xff0c;可以考虑增加连接池的最大连接数。&#xff08;注&#xff1a;不能…

权限维持-域环境单机版---自启动

免责声明:本文仅做技术交流与学习... 目录 1.windows自启动路径加载 2.自启动服务加载 3.自启动注册表加载 所在regedit目录: -添加启动项 --重启生效 4.计划计时任务 windows软件或程序服务开机自启动的四种方式-CSDN博客 1.windows自启动路径加载 --当windows注销…