06.数据解析-xpath

1、什么是xpath

XPath (XML Path Language) 是一门在 HTML\XML 文档中查找信息的语言,可用来在 HTML\XML 文档中对元素和属性进行遍历

W3School官方文档:http://www.w3school.com.cn/xpath/index.asp

2、认识xml

知识点:

  • html和xml的区别
  • xml中各个元素的的关系和属性

2、1 html和xml的区别

在这里插入图片描述

2、2 xml的树结构

<bookstore>
<book category="COOKING"><title lang="en">Everyday Italian</title> <author>Giada De Laurentiis</author> <year>2005</year> <price>30.00</price> 
</book>
<book category="CHILDREN"><title lang="en">Harry Potter</title> <author>J K. Rowling</author> <year>2005</year> <price>29.99</price> 
</book>
<book category="WEB"><title lang="en">Learning XML</title> <author>Erik T. Ray</author> <year>2003</year> <price>39.95</price> 
</book>
</bookstore>

上面的xml内容可以表示为下面的树结构

上面的这种结构关系在xpath被进一步细化

3、xpath的节点关系

知识点:

  • 认识xpath中的节点
  • 了解xpath中节点之间的关系
  • 每个html的标签我们都称之为节点。(根节点、子节点、同级节点)

4、xpath语法

XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

下面列出了最有用的表达式:

表达式描述
nodename选中该元素。
/从根节点选取、或者是元素和元素间的过渡。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。跨节点获取标签
.选取当前节点。
选取当前节点的父节点。
@选取属性。
text()选取文本。

在下面的表格中,我们已列出了一些路径表达式以及表达式的结果:

路径表达式结果
bookstore选择bookstore元素。
/bookstore选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//book/title/@lang选择所有的book下面的title中的lang属性的值。
//book/title/text()选择所有的book下面的title的文本。
  • 选取未知节点
通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。

在下面的表格中,我们列出了一些路径表达式,以及这些表达式的结果:

路径表达式结果
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
//title[@*]选取所有带有属性的 title 元素。
  • 案例

            <div> <ul> <li class="item-1"><a href="link1.html">第一个</a></li> <li class="item-2"><a href="link2.html">第二个</a></li> <li class="item-3"><a href="link3.html">第三个</a></li> <li class="item-4"><a href="link4.html">第四个</a></li> <li class="item-5"><a href="link5.html">第五个</a> </li></ul></div>
    
    import parsel  # str --> Selector对象   具有xpath方法   提取到的数据返回一个列表html_str = """<div> <ul> <li class="item-1"><a href="link1.html">第一个</a></li> <li class="item-2"><a href="link2.html">第二个</a></li> <li class="item-3"><a href="link3.html">第三个</a></li> <li class="item-4"><a href="link4.html">第四个</a></li> <li class="item-5"><a href="link5.html">第五个</a> </li></ul></div>"""
    # 1、转换数据类型
    # data = parsel.Selector(html_str).extract()  # parsel能够把缺失的html标签补充完成
    data = parsel.Selector(html_str)  # parsel能够把缺失的html标签补充完成
    # 2、解析数据--list类型
    # print(data)
    # 2、1 从根节点开始,获取所有<a>标签
    result = data.xpath('/html/body/div/ul/li/a').extract()
    # 2、2 跨节点获取所有<a>标签
    result = data.xpath('//a').extract()
    # 2、3 选取当前节点   使用场景:需要对选取的标签的下一级标签进行多次提取
    result = data.xpath('//ul')
    result2 = result.xpath('./li').extract()    # 提取当前节点下的<li>标签
    result3 = result.xpath('./li/a').extract()  # 提取当前节点下的<a>标签
    # 2、4 选取当前节点的父节点,获取父节点的class属性值
    result = data.xpath('//a')
    result4 = result.xpath('../@class').extract()
    # 2、5 获取第三个<li>标签的节点(两种方法)
    result = data.xpath('//li[3]').extract()
    result = data.xpath('//li')[2].extract()
    # 2、6 通过定位属性的方法获取第四个<a>标签
    result = data.xpath('//a[@href="link4.html"]').extract()
    # 2、7 用属性定位标签,获取第四个<a>标签包裹的文本内容
    result = data.xpath('//a[@href="link4.html"]/text()').extract()
    # 2、8 获取第五个<a>标签的href属性值
    result = data.xpath('//li[5]/a/@href').extract()
    # 了解 模糊查询
    result = data.xpath('//li[contains(@class,"it")]').extract()
    # 同时获取<li>标签的属性以及<a>标签的文本
    # result = data.xpath('//li/@class|//a/text()').extract()print(result)
    
  • 如何选取多个标签?

    通过在路径表达式中使用“|”运算符,您可以选取若干个路径。(逻辑运算符)

6、小结

  1. xpath的概述XPath (XML Path Language),解析查找提取信息的语言
  2. xpath的节点关系:根节点,子节点,同级节点
  3. xpath的重点语法获取任意节点://
  4. xpath的重点语法根据属性获取节点:标签[@属性 = '值']
  5. xpath中获取节点的文本:text()
  6. xpath的获取节点属性值:@属性名

@拓展知识

转义字符

在需要在字符中使用特殊字符时,python 用反斜杠转义字符。如下表:

转义字符描述
\(在行尾时)续行符
\反斜杠符号
\'单引号
\"双引号
\a响铃
\b退格(Backspace)
\e转义
\000
\n换行
\v纵向制表符
\t横向制表符
\r回车
\f换页
\oyy八进制数,yy代表的字符,例如:\o12代表换行
\xyy十六进制数,yy代表的字符,例如:\x0a代表换行
\other其它的字符以普通格式输出
原始字符串

由于字符串中的反斜线都有特殊的作用,因此当字符串中包含反斜线时,就需要使用转义字符 \ 对字符串中包含的每个 “” 进行转义。

比如说,我们要写一个关于 Windows 路径 G:\publish\codes\02\2.4 这样的字符串,如果在 Python 程序中直接这样写肯定是不行的,需要使用 \ 转义字符,对字符串中每个 ‘’ 进行转义,即写成 G:\publish\codes\02\2.4 这种形式才行。

有没有觉得这种写法很啰嗦,有没有更好的解决办法呢?答案是肯定的,借助于原始字符串可以很好地解决这个问题。

原始字符串以“r”开头,它不会把反斜线当成特殊字符。因此,上面的 Windows 路径可直接写成如下这种形式:

# 原始字符串包含的引号,同样需要转义
s2 = r'"Let\'s go", said Charlie'
print(s2)

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

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

相关文章

OpenGLES:绘制一个混色旋转的3D圆柱

效果展示 本篇博文会实现两种混色效果的3D圆柱&#xff1a; 一.圆柱体解析 上一篇博文讲解了怎么绘制一个混色旋转的立方体 这一篇讲解怎么绘制一个混色旋转的圆柱 圆柱的顶点创建主要基于2D圆进行扩展&#xff0c;与立方体没有相似之处 圆柱绘制的关键点就是将圆柱拆解成…

数据结构与算法-前缀树

数据结构与算法-前缀树详解 1 何为前缀树 2 前缀树的代码表示及相关操作 1 何为前缀树 前缀树 又称之为字典树,是一种多路查找树,多路树形结构,是哈希树的变种&#xff0c;和hash效率有一拼&#xff0c;是一种用于快速检索的多叉树结构。 性质&#xff1a;不同字符串的相同…

开环模块化多电平换流器仿真(MMC)N=6(Simulink仿真)

&#x1f4a5;&#x1f4a5;&#x1f49e;&#x1f49e;欢迎来到本博客❤️❤️&#x1f4a5;&#x1f4a5; &#x1f3c6;博主优势&#xff1a;&#x1f31e;&#x1f31e;&#x1f31e;博客内容尽量做到思维缜密&#xff0c;逻辑清晰&#xff0c;为了方便读者。 ⛳️座右铭&a…

热迁移中VirtIO-PCI设备的配置空间处理

文章目录 问题现象定位过程日志分析源端目的端 原理分析基本原理上下文分析复现分析patch分析 总结解决方案 问题现象 集群升级虚拟化组件版本&#xff0c;升级前存量运行并挂载了virtio磁盘的虚拟机集群内热迁移到升级后的节点失败&#xff0c;QEMU报错如下&#xff1a; 202…

Docker 日志管理 - ELK

Author&#xff1a;rab 目录 前言一、Docker 日志驱动二、ELK 套件部署三、Docker 容器日志采集3.1 部署 Filebeat3.2 配置 Filebeat3.3 验证采集数据3.4 Kibana 数据展示3.4.1 创建索引模式3.4.2 Kibana 查看日志 总结 前言 如何查看/管理 Docker 运行容器的日志&#xff1f;…

RK3568的CAN驱动适配

目录 背景&#xff1a; 1.内核驱动模块配置 2.设备树配置 3.功能测试 4.bug修复 背景&#xff1a; 某个项目上使用RK3568的芯片&#xff0c;需要用到4路CAN接口进行通信&#xff0c;经过方案评审后决定使用RK3568自带的3路CAN外加一路spi转的CAN实现功能&#xff0c;在这个…

CCF中国开源大会专访|毛晓光:“联合”是开源走向“共赢”的必由之路

受访嘉宾 | 毛晓光 记者 | 朱珂欣 2023 CCF 中国开源大会&#xff08; CCF ChinaOSC &#xff09;拟于 2023 年 10 月 21 日至 22 日在湖南省长沙市北辰国际会议中心召开。 作为第二届 CCF 中国开源大会&#xff0c;本届大会将组织特邀报告、高峰论坛和领域分论坛等不同类…

林沛满-TCP之在途字节数

本文整理自&#xff1a;《Wireshark网络分析的艺术 第1版》 作者&#xff1a;林沛满 著 出版时间&#xff1a;2016-02 我一直谨记斯蒂芬霍金的金玉良言—每写一道数学公式就会失去一半读者。不过为了深度分析网络包&#xff0c;有时候是不得不计算的&#xff0c;好在小学一年级…

机器学习笔记 - 两个静态手势识别的简单示例

一、关于手势识别 手势识别方法通常分为两类:静态或动态。 静态手势是那些只需要在分类器的输入处处理单个图像的手势,这种方法的优点是计算成本较低。动态手势需要处理图像序列和更复杂的手势识别方法。 进一步了解可以参考下面链接。 静态手势识别和动态手势识别的区别和技…

Unity可视化Shader工具ASE介绍——2、ASE的Shader创建和输入输出

大家好&#xff0c;我是阿赵&#xff0c;这里继续介绍Unity可视化写Shader的ASE插件的用法。上一篇介绍了ASE的安装和编辑器界面分布&#xff0c;这一篇主要是通过一个简单的例子介绍shader的创建和输入输出。 一、ASE的Shader创建 这里先选择Surface类型的Shader&#xff0c;…

8.2 JUC - 4.Semaphore

目录 一、是什么&#xff1f;二、简单使用三、semaphore应用四、Semaphore原理 一、是什么&#xff1f; Semaphore&#xff1a;信号量&#xff0c;用来限制能同时访问共享资源的线程上限 二、简单使用 public class TestSemaphore {public static void main(String[] args) …

校招秋招,性格和职业有关系吗?

企业在招聘应届毕业生时不再局限于普通的面试或者笔试&#xff0c;在互联网时代&#xff0c;为了能够更好的匹配需要的优质人才&#xff0c;企业会通过各种测试来提高招聘的准确率以及成功率。也许以前很多人都听说过性格和职业是有一定关系的&#xff0c;但是如何确定自己的性…