【scrapy】3.XPath解析

news2024/11/25 21:41:32

目录

一、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.coloradmin.cn/o/1873446.html

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

相关文章

Python安装库太慢?配置好这个速度立马提上来

Python 的 pip 包管理器在安装库时可能会因为各种原因而显得很慢。以下是一些可能的原因以及相应的解决方案&#xff1a; 网络问题&#xff1a; 你的网络连接可能不稳定或速度较慢。Python 的官方 PyPI (Python Package Index) 服务器可能距离你较远&#xff0c;导致传输延迟。…

【Qt】QMessageBox 各种对话框的默认显示效果

1. 函数原型 void about(QWidget *parent, const QString &title, const QString &text)void aboutQt(QWidget *parent, const QString &title QString())QMessageBox::StandardButton critical(QWidget *parent, const QString &title, const QString &…

数字信号处理实验一(离散信号及离散系统的MATLAB编程实现)

实验要求&#xff1a; 离散信号及离散系统的MATLAB编程实现&#xff08;2学时&#xff09; 要求&#xff1a; 编写一程序&#xff0c;输出一定长度&#xff08;点数&#xff09;&#xff0c;具有一定幅度、&#xff08;角&#xff09;频率和初始相位的实&#xff08;或复&…

【C++】动态内存管理new和delete

文章目录 一、C的内存管理方式二、new和delete的用法1.操作内置类型2.操作自定义内置类型 三、new和delete的底层实现1.operator new和operator delete函数2.new和delete的实现原理 四、定位new表达式五、malloc/free和new/delete的区别 一、C的内存管理方式 之前在C语言的动态…

超详细之IDEA上传项目到Gitee完整步骤

1. 注册gitee 账号密码&#xff0c;gitee官网地址&#xff1a;Gitee官网&#xff0c;注册完成后&#xff0c;登录。 2. 创建仓库&#xff0c;在主页左下角有新建按钮&#xff0c;点击新建后会进入到此页面填写仓库信息。 3. 创建完成后复制仓库地址 4. 打开IntelliJ IDEA新建或…

Docker 安装最新版本 Jenkins

目录 1、下载、启动容器、更新到最新版本 2、查看初始密码两种方式&#xff1a; 3、默认安装的部分未汉化&#xff0c;删除默认的汉化插件。重启容器&#xff0c;重新安装汉化插件 4、安装 Publish over SSH、docker-build-step 、Docker Commons 插件 5、配置服务器连接信…

Arduino - LED 矩阵

Arduino - LED 矩阵 Arduino - LED Matrix LED matrix display, also known as LED display, or dot matrix display, are wide-used. In this tutorial, we are going to learn: LED矩阵显示器&#xff0c;也称为LED显示器&#xff0c;或点阵显示器&#xff0c;应用广泛。在…

人大金仓×深信服:打造高性能、高可靠教育信创数据库一体机解决方案

信息技术应用创新是数字经济发展的关键支撑和重要基石&#xff0c;近年来&#xff0c;国家高度重视信息技术应用创新产业发展。教育行业作为我国人才培养的发动机&#xff0c;发展教育信创是保持信创创新力、是提升信创人才质量的重要举措、是保障信创产业可持续发展的关键环节…

做短视频赛道,云微客矩阵系统提醒这些雷区要避开!

90%的实体老板做抖音短视频都踩过雷区&#xff0c;那就是上来就真人出镜拍视频&#xff0c;要么自己上要么让员工上。但是我们大家试想下&#xff0c;企业做短视频是想借助平台流量找客户的&#xff0c;又不是来当网红的&#xff0c;拍剧情、想段子&#xff0c;无非就是浪费时间…

Redis集群部署合集

目录 一. 原理简述 二. 集群配置​​​​​​​ 2.1 环境准备 2.2 编译安装一个redis 2.3 创建集群 2.4 写入数据测试 实验一&#xff1a; 实验二&#xff1a; 实验三&#xff1a; 实验四&#xff1a; 添加节点 自动分配槽位 提升节点为master&#xff1a; 实验…

docker 学习之路

文章目录 1、官方文档2、常用命令挂载Docker容器内运行的脚本或命令常用 3、介绍4、Dockerfile5、问题6、链接 ​ 1、官方文档 Docker 是一个开源的应用容器引擎&#xff0c;让开发者可以打包他们的应用以及依赖包到一个可移植的镜像中&#xff0c;然后发布到任何流行的 Linux…

【软件测试】对于测试中各式的概念,你了解多少?

目录 1.需求 2.开发模型 2.1.软件的生命周期 2.2.瀑布模型 2.3.螺旋模型 2.4.增量模型、迭代模型 2.5.敏捷模型 3.测试模式 3.1.V模型 3.2.双V模型 在学习后面的知识前&#xff0c;先来熟知一个概念 什么是软件测试&#xff1a;软件测试就是验证软件产品特性是否满足…

[java多版本管理] JEnv-for-Windows 详细安装和使用

文章目录 JEnv-for-Windows文件下载地址用法&#xff08;注意&#xff1a;本地覆盖更改。使用本地覆盖&#xff09;这是如何工作的&#xff1f;java 常用的版本 JEnv-for-Windows文件下载地址 温馨提示: 需要元子 文件下载地址 管理员执行jenv.bat文件 执行正常, 接下来就是…

AUTOSAR NvM模块(一)

NvMBlockDescriptor [ECUC_NVM_00061] 用于存储所有特定于块的配置参数的容器。对于每个非易失性随机存取存储器&#xff08;NVRAM&#xff09;块&#xff0c;应该指定这个容器的一个实例。 NvMBlockCrcType 定义了NVRAM块的CRC数据宽度。根据Autosar标准&#xff0c;此参数…

msvcp120.dll文件不见了要怎么处理?教你科学的方法修复msvcp120.dll

msvcp120.dll文件不见了&#xff1f;那么这时候你就要注意了&#xff0c;有可能你的某些程序已经打不开了&#xff01;因为这个msvcp120.dll文件是用来支持程序运行的&#xff0c;下面我们一起来聊一下msvcp120.dll文件不见了要怎么修复。 一.msvcp120.dll文件讲解 msvcp120.d…

Java SE入门及基础(58) 并发 进程与线程概念

目录 并发 进程和线程 1. 进程和线程 2. 进程 3.线程 总结 并发 并发(Concurrency) Computer users take it for granted that their systems can do more than one thing at a time. They assume that they can continue to work in a word processor, while other app…

AI大模型怎么备案?

随着人工智能技术的飞速发展&#xff0c;生成式AI正逐渐渗透到我们的日常生活和各行各业中。从文本创作到艺术设计&#xff0c;从虚拟助手到智能客服&#xff0c;AI的身影无处不在。然而&#xff0c;技术的创新与应用&#xff0c;离不开法律的规范与引导。为进一步保障和监管AI…

《昇思25天学习打卡营第2天|快速入门》

文章目录 前言&#xff1a;今日所学&#xff1a;1. 数据集处理2. 网络的构建3. 模型训练4. 保存模型5. 加载模型 总体代码与运行结果&#xff1a;1. 总体代码2. 运行结果 前言&#xff1a; 今天是学习打卡的第2天&#xff0c;今天的内容是对MindSpore的一个快速入门&#xff0…

HarmonyOS ArkUi ArkWeb加载不出网页问题踩坑

使用 使用还是比较简单的&#xff0c;直接贴代码了 别忘了配置网络权限 Entry Component struct WebPage {State isAttachController: boolean falseState url: string State title: string Prop controller: web_webview.WebviewController new web_webview.WebviewCont…

锐捷网络闪耀CVPR 2024,外观异常检测方案斩获世界认可!

近日&#xff0c;锐捷网络在“视觉异常检测和创新性检测2024挑战赛”(Visual Anomaly and Novelty Detection 2024 Challenge&#xff0c;简称VAND)的少样本逻辑/结构异常检测赛道(VAND 2.0赛道2)中荣获第二名&#xff0c;并在计算机视觉顶级会议CVPR 2024上展示了这一成果&…