【恭喜宿主:你的神装Xpath到手】——07全栈开发——如桃花来

news2024/11/20 18:25:47

目录索引

  • ==什么是XML:==
    • 文档演示:
  • ==XML的节点关系:==
    • 1.父节点:
    • 2. 子节点:
    • 3. 同胞节点:
    • 4. 先辈节点:
    • 5. 后代节点:
  • ==Xpath:==
    • 1. 相关语法:
      • *最常用的路径表达式:*
    • 2. 谓语:
    • 3. 选取未知节点:
    • 4. 选取若干路径:
  • ==LXML库配合Xpath进行有效解析:==
    • 1. 导包:
    • 2. 实例化解析对象:
    • 3. 输出转换后的html代码:
    • 1. 实例演示:
  • ==总结:==

恭喜你,获得了新的神装:Xpath
技能:解析神器,用于高效处理HTML文档
限制:我们需要先将HTML文件转换成XML文档,然后用Xpath查找HTML里的节点或元素。

永远支持全宇宙最好的BeautifulSoup,当然了Xpath也有它好的一面,都需要了解。Xpath特别适用于文档解析,是以路径的形式来进行描述的。

什么是XML:

  • XML指可扩展标记语言
  • XML 是一种标记语言,很类似 HTML
  • XML 的设计宗旨是传输数据,而非显示数据
  • XML 的标签需要我们自行定义
  • 会自动补齐缺失的尾标签

文档演示:

<?xml version="1.0" encoding="utf-8"?>

<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">XQuery Kick Start</title>  
    <author>James McGovern</author>  
    <author>Per Bothner</author>  
    <author>Kurt Cagle</author>  
    <author>James Linn</author>  
    <author>Vaidyanathan Nagarajan</author>  
    <year>2003</year>  
    <price>49.99</price> 
  </book> 

  <book category="web" cover="paperback"> 
    <title lang="en">Learning XML</title>  
    <author>Erik T. Ray</author>  
    <year>2003</year>  
    <price>39.95</price> 
  </book> 

</bookstore>

XML的节点关系:

1.父节点:

每个元素以及属性都有一个父

<?xml version="1.0" encoding="utf-8"?>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

我们可以知道:book元素就是其中的父元素,它是 title\author\year\price 元素的父

2. 子节点:

元素节点可能有零个、一个或多个子节点

<?xml version="1.0" encoding="utf-8"?>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

我们得知:title\author\year\price 都是book的子元素节点

3. 同胞节点:

拥有相同的父节点

<?xml version="1.0" encoding="utf-8"?>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

在这里:title\author\year\price 之间互为同胞节点

4. 先辈节点:

父及以上,如爷爷等都是属于先辈节点

<?xml version="1.0" encoding="utf-8"?>

<bookstore>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

</bookstore>

在这里:author的先辈节点是book元素和bookstore元素

5. 后代节点:

与先辈节点相反,儿孙等都是后代节点



```xml
<?xml version="1.0" encoding="utf-8"?>

<bookstore>

<book>
  <title>Harry Potter</title>
  <author>J K. Rowling</author>
  <year>2005</year>
  <price>29.99</price>
</book>

</bookstore>

在这里:bookstore的后代是 book\title\author\year\price 元素

Xpath:

这是一门在xml文档中查找信息的语言,可用来在XML文档中对元素和属性进行遍历。XPath 使用路径表达式来选取 XML 文档中的节点或者节点集。这些路径表达式和我们在常规的电脑文件系统中看到的表达式非常相似。

1. 相关语法:

最常用的路径表达式:

表达式描述
nodename选取此节点的所有子节点。
/从根节点选取。
//从匹配选择的当前节点选择文档中的节点,而不考虑它们的位置。(用的多)
.选取当前节点。
选取当前节点的父节点。
@选取属性。 (重要)

举例:

路径表达式结果
bookstore选取 bookstore 元素的所有子节点。
/bookstore选取根元素 bookstore。注释:假如路径起始于正斜杠( / ),则此路径始终代表到某元素的绝对路径!
bookstore/book选取属于 bookstore 的子元素的所有 book 元素。
//book选取所有 book 子元素,而不管它们在文档中的位置。
bookstore//book选择属于 bookstore 元素的后代的所有 book 元素,而不管它们位于 bookstore 之下的什么位置。
//@lang选取名为 lang 的所有属性。

2. 谓语:

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

人话就是:用[]框起来表示筛选条件的就是谓语

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

路径表达式结果
/bookstore/book[1]选取属于 bookstore 子元素的第一个 book 元素。
/bookstore/book[last()]选取属于 bookstore 子元素的最后一个 book 元素。
/bookstore/book[last()-1]选取属于 bookstore 子元素的倒数第二个 book 元素。
/bookstore/book[position()< 3]选取最前面的两个属于 bookstore 元素的子元素的 book 元素。
//title[@lang]选取所有拥有名为 lang 的属性的 title 元素。
//title[@lang=’eng’]选取所有 title 元素,且这些元素拥有值为 eng 的 lang 属性。
/bookstore/book[price>35.00]选取 bookstore 元素的所有 book 元素,且其中的 price 元素的值须大于 35.00。
/bookstore/book[price>35.00]/title选取 bookstore 元素中的 book 元素的所有 title 元素,且其中的 price 元素的值须大于 35.00。

注意:

  • 元素从第一个开始选,不是零
  • []是筛选条件,是将符合的元素呈现出来,而不是取里面的值

3. 选取未知节点:

Xpath通配符可用来选取未知的XML元素

通配符描述
*匹配任何元素节点。
@*匹配任何属性节点。
node()匹配任何类型的节点。
  • node()表示的是节点,* 表示的是元素,元素、文本、注释都属于节点,而标签属于元素,同时,标签后面的文本也会被识别为元素,只有标签前面的文本被当做文本来识别,所以使用*号时识别不到a标签前面的文本内容
  • node()>*

例子:

路径表达式结果
/bookstore/*选取 bookstore 元素的所有子元素。
//*选取文档中的所有元素。
html/node()/meta/@*选择html下面任意节点下的meta节点的所有属性
//title[@*]选取所有带有属性的 title 元素。

4. 选取若干路径:

用过在路径表达式中使用"|"运算符,可以选取若干个路径。

例子:

路径表达式结果
//book/title | //book/price选取 book 元素的所有 title 和 price 元素。
//title | //price选取文档中的所有 title 和 price 元素。
/bookstore/book/title | //price选取属于 bookstore 元素的 book 元素的所有 title 元素,以及文档中所有的 price 元素。

LXML库配合Xpath进行有效解析:

lxml 是 一个HTML/XML的解析器,主要的功能是如何解析和提取 HTML/XML 数据。
lxml和正则一样,也是用 C 实现的,是一款高性能的 Python HTML/XML 解析器,我们可以利用之前学习的XPath语法,来快速的定位特定元素以及节点信息。

1. 导包:

from lxml import etree

2. 实例化解析对象:

xml = etree.HTML(html网页)

3. 输出转换后的html代码:

直接打印xml是输出不了的,它是一个对象,

#以字节形式输出转换后的html代码,前面带有b。若想正常输出需要用decode()进行解码
etree.tostring()
#举个例子:
print(etree.tostring(xml))

例子:
在这里插入图片描述

#举个例子:
print(etree.tostring(xml).decode())

呈现效果:
在这里插入图片描述

1. 实例演示:

html = '''
<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></li>
</div>
'''
#1. 导包,使用lxml中的etree类
from lxml import etree
#2. 创建实例化对象,共Xpath的解析对象(转换为xml格式的文档)
xml = etree.HTML(html)
#print(etree.tostring(xml).decode())#会自动补全body,html的尾部标签

下面的拆解的代码,便于阅读,默认拥有以上的代码:

#获取其中的li标签
result = xml.xpath("//li")#获取任意层级下的li标签
#print(result)#打印出来全都是对象,需要用tostring加decode()转化
for i in result:
    r = etree.tostring(i).decode()
    print(r)

呈现效果:
在这里插入图片描述

#获取其中的class属性的值:
result = etree.xpath("//li/@class")
print(result)

在这里插入图片描述

都是以列表的形式输出

#获取a标签中的href值
result = xml.xpath("//li/a/@href")
print(result)

在这里插入图片描述

#找li标签下的href为link1.html的a标签的文本内容:
result = xml.xpath('//li/a[@href = "link1.html"]/text()')
print(result)

在这里插入图片描述

总结:

  • 返回的结果都是列表
  • 获取标签的具体内容一般不用tostring()
  • 只要涉及到条件,加[]
  • 只要涉及获取属性值,加@,@是拿的意思
  • 通过/text()可以获取文本内容

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

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

相关文章

Android Studio实现文艺阅读App

项目目录 一、系统概述二、系统特点三、开发环境四、运行演示五、源码获取 一、系统概述 本次带来的文艺阅读App可以提供高质量的原创文学作品。用户可以App中找到各种类型的文学作品&#xff0c;包括小说、散文、诗歌等&#xff0c;由来自不同领域的作家所创作。此外&#xf…

对不起,我们不招还在用Excel的人,和金山系新秀比起差太远了

相信点进来的朋友曾经也深受Excel荼毒。 的确&#xff0c;现如今在网上随便一搜&#xff0c;关于Excel的学习资料和答疑解惑的帖子不胜枚举&#xff0c;盖因为Excel有时太过热心&#xff0c;当然&#xff0c;是帮倒忙的那种热心。 自动把天数转换为日期&#xff0c;还替你把身…

Flume 从入门到精通

Flume Flume 是一种分布式、可靠且可用的服务 高效收集、聚合和移动大量日志 数据。 它具有基于流媒体的简单灵活的架构 数据流。它坚固耐用&#xff0c;容错&#xff0c;可靠性可调 机制以及许多故障转移和恢复机制。 它 使用允许在线分析的简单可扩展数据模型 应用。 系统要求…

Java程序设计入门教程---循环结构(while)

目录 思考 概念 语法 案例&#xff1a;求1到100的整数和&#xff1f; 案例分析 思考 1. 让你输出10000000000000000句“Hello,world!”&#xff0c;你怎么写代码&#xff1f; 2. 求1到100的整数和&#xff1f; 概念 循环结构程序多次循环执行相同或相近的任务。 while循环…

Nacos注册中心一些配置说明

未安装Nacos的可以参考以下的安装教程 Nacos 安装教程&#xff08;史上最详细保姆级教程&#xff09;_nacos安装_大三的土狗的博客-CSDN博客 注意: Nacos默认是集群部署,如果想单机启动需要在对应Nacos的bin目录执行下面的命令 因为以后不可能只有一个Nacos注册中心,所以就默认…

BERT+TextCNN实现医疗意图识别项目

BERTTextCNN实现医疗意图识别项目 一、说明 本项目采用医疗意图识别数据集CMID传送门 数据集示例&#xff1a; {"originalText": "间质性肺炎的症状?", "entities": [{"label_type": "疾病和诊断", "start_pos&quo…

Qt-数据库开发-用户登录、后台管理用户

Qt-数据库开发-用户登录、后台管理用户 [1] Qt-数据库开发-用户登录、后台管理用户1、概述2、实现效果 [2] Qt使用SqlLite实现权限管理初始化数据库创建数据表插入数据可使用结构体对数据信息进行封装数据库查询函数为数据库更新数据函数为删除数据函数为 [3] 测试效果 [1] Qt-…

最详细的静态路由的原理和配置

第四章&#xff1a;静态路由 转发数据包是路由器的最主要功能。路由器转发数据包时需要查找路由表&#xff0c;管理员可以通过手工的方法在路由器中直接配置路由表&#xff0c;这就是静态路由。虽然静态路由不适合于在大的网络中使用&#xff0c;但是由于静态路由简单、路由器…

亚马逊云科技让数十亿的数据清洗、转移和查询只需要10分钟

随着数字经济对经济社会的发展贡献愈渐增多&#xff0c;数字金融作为数字经济的有机组成部分和重要支撑&#xff0c;也正成为金融领域竞争与合作的制高点。但在数据要素推动数字金融高速发展的同时&#xff0c;逐渐复杂的互联网环境与日益增强的金融监管力度&#xff0c;对数字…

FL Studio21最新中文版本下载及详细安装教程

FL Studio21最新中文版本是一款专业的音乐制作软件&#xff0c;软件支持录音、音频剪辑、混音、编曲等众多实用功能&#xff0c;可以让你的电脑化身为专业的录音室&#xff0c;进行音乐的录制和剪辑工作&#xff0c;帮助用户轻松创作出各种优秀的音乐作品。 FL Studio21中文版…

亚马逊云科技携手普华永道,推出健康及生命科学行业出海合规指南

自2022年起&#xff0c;国内医疗健康行业的投融资热度略有降低。但医疗行业投资结构正面临转型&#xff0c;投资逐步呈现全球化布局的趋势&#xff0c;在跨境合作领域仍持续释放活力。同时&#xff0c;随着药品集采、医保谈判持续推进&#xff0c;越来越多的中国健康及生命科学…

基于RK3588+TensorFlow的人工智能跨模态行人重识别方法及应用

摘要&#xff1a; 跨模态行人重识别技术&#xff08;cm-ReID&#xff09;旨在可见光、红外等不同模态图像中识别出同一个人&#xff0c;其在人 机协同、万物互联、跨界融合、万物智能的智能系统与装备中有重要应用。提出一种数据增强的跨模态行人 重识别方法&#xff0c;在波长…

【Vue 基础】尚品汇项目-10-Search模块中商品分类与过渡动画

一、商品导航的显示与隐藏 打开“src/componetnts/TypeNav/index.vue”&#xff0c;让商品导航默认为显示 在TypeNav组件挂载完毕时&#xff0c;判断当前的路由是否是“/home”&#xff0c;如果不是“/home”&#xff0c;就将分类导航隐藏 当鼠标移入时 移入时让商品导航显示 …

如何在Windows上轻松安全的将数据从HDD迁移到SSD?

当你打算升级硬盘时&#xff0c;如何将数据从HDD迁移到SSD&#xff1f;你可以使用一款免费的软件将所有数据从一个硬盘克隆到另一个硬盘。 为什么要将数据从HDD迁移到SSD&#xff1f; HDD&#xff08;机械硬盘&#xff09;和SSD&#xff08;固态硬盘&#xff09;是目前常用…

java 学习日记

今天先搞题目 给你一个points 数组&#xff0c;表示 2D 平面上的一些点&#xff0c;其中 points[i] [xi, yi] 。 连接点 [xi, yi] 和点 [xj, yj] 的费用为它们之间的 曼哈顿距离 &#xff1a;|xi - xj| |yi - yj| &#xff0c;其中 |val| 表示 val 的绝对值。 请你返回将所…

DS1302芯片介绍

低功耗时钟芯片DS1302可以对年、月、日、时、分、秒进行计时&#xff0c;且具有闰年补偿等多种功能。 DS1302的性能特性&#xff1a; 实时时钟&#xff0c;可对秒、分、时、日、周、月以及带闰年补偿的年进行计数&#xff1b; 用于高速数据暂存的318位RAM&#xff1b; 最少引脚…

Redis --- 持久化、主从

一、Redis持久化 Redis有两种持久化方案&#xff1a; RDB持久化 AOF持久化 1.1、RDB持久化 RDB全称Redis Database Backup file&#xff08;Redis数据备份文件&#xff09;&#xff0c;也被叫做Redis数据快照。简单来说就是把内存中的所有数据都记录到磁盘中。当Redis实例故…

第 5 章 HBase 优化

5.1 RowKey 设计 一条数据的唯一标识就是 rowkey&#xff0c;那么这条数据存储于哪个分区&#xff0c;取决于 rowkey 处于 哪个一个预分区的区间内&#xff0c;设计 rowkey的主要目的 &#xff0c;就是让数据均匀的分布于所有的 region 中&#xff0c;在一定程度上防止数据倾斜…

年前无情被裁,我面试大厂的这3个月....

春招接近尾声&#xff0c;即将远去的“金三银四”今年也变成了“铜三铁四”。 大厂不断缩招&#xff0c;不容忽视的疫情影响&#xff0c;加上不断攀升的毕业生人数&#xff0c;各种需要应对的现实问题让整个求职季难上加难。 在这个异常残酷的求职季&#xff0c;很多人的困惑…

阿里系App抓包详细分析

InnerMtopInitTask OpenMtopInitTask ProductMtopInitTask 三个实现分别对应的instanceId为&#xff1a;OPEN、INNER、PRODUCT&#xff0c;咱们主要看InnerMtopInitTask这个实现&#xff0c;分析里面重要的初始化步骤&#xff0c;最后再使用Charles完成抓包。 IMtopInitTas…