preceding-sibling轴用于选择与当前节点同父且在文档顺序中位于其前的所有同级节点,例如在html中定位同一父元素下排在当前节点前面的兄弟元素;与preceding轴不同,后者范围更广,包含文档中所有非祖先的前置节点,而不仅限于同级;通过添加位置谓语[1]可精确选取紧邻的前一个同级节点,如preceding-sibling::*[1];该轴常用于网页抓取中关联上下文信息、提取列表前置数据、定位表单标签或处理错误提示,适用于通过相对位置关联数据的非规整结构场景。

XPath的
preceding-sibling轴,说白了,就是让你能往回找,找那些跟你在同一个爹妈生的、又比你早出生的兄弟姐妹。它帮你定位到当前节点在文档流中排在它前面的、并且拥有同一个父节点的所有同级元素。
解决方案
preceding-sibling轴用于选择当前节点(上下文节点)的所有先行同级节点。这意味着它会查找与当前节点共享相同父节点,并且在文档顺序中出现在当前节点之前的节点。
它的基本用法是:
当前节点路径/preceding-sibling::目标节点类型。
举个例子,如果你有一个HTML结构:
这是第一段
这是一个span这是当前段落
这是一个em
如果你当前选中的是
这个节点,那么使用
preceding-sibling::p就会选中前面的
。而这是第一段
preceding-sibling::*则会选中
和这是第一段
这是一个span。
它只关心“同级”和“之前”,不关心层级关系。这一点非常关键,因为它限定了查找的范围,让你的XPath表达式更加精确。很多时候,我们就是需要这种特定方向上的“邻居”信息。
preceding-sibling 和 preceding 有什么区别?
这是个特别容易混淆的地方,但理解了就豁然开朗了。简单来说,
preceding-sibling更“亲近”,而
preceding更“广阔”。
preceding-sibling轴,就像前面说的,它只找“同父同母”的兄弟姐妹,而且必须是排在你前面的。它的搜索范围被严格限制在当前节点的同级节点中。
而
preceding轴,它的范围就大多了。它会选择文档中所有在当前节点之前出现的节点,只要它们不是当前节点的祖先节点、属性节点或命名空间节点。这意味着它不仅会包括你的前同级兄弟姐妹,还会包括你叔叔阿姨家的孩子(也就是你父辈的同级节点下的子节点),甚至更远,只要它们在文档顺序上排在你前面。
来个直观的例子:
如果我们的上下文节点是
:
- 使用
./preceding-sibling::*
,只会选中内层span,因为它在同一个div
父节点下,且排在之前。
- 使用
./preceding::*
,则会选中内层span、
,因为它寻找的是文档中所有在外层段落1
之前出现的非祖先节点。你看,
虽然不是外层段落1
的同级,但它在文档顺序上确实在
之前,所以也会被选中。
所以,如果你明确知道要找的是同一个父节点下的前一个或前几个兄弟元素,用
preceding-sibling会更精准、更高效。如果需要更广泛地向前查找,那就考虑
preceding。
如何精确选择前一个同级节点?
很多时候,我们并不想选择所有前面的同级节点,而是仅仅想抓取紧挨着当前节点的前一个同级节点。这在处理数据列表或者表单元素时特别常见。
要实现这个,其实很简单,就是在
preceding-sibling后面加上一个位置谓语
[1]。
例如:
当前节点路径/preceding-sibling::*[1]
这里的
*表示任何元素类型,
[1]则表示选择结果集中的第一个。由于
preceding-sibling轴默认是从离当前节点最近的那个同级节点开始“倒序”排列的,所以
[1]就恰好选中了紧挨着当前节点、并且在它前面的那个同级节点。
如果你知道具体要找的元素类型,可以更精确:
当前节点路径/preceding-sibling::div[1],这会选择紧邻的、且类型为
div的前一个同级节点。
举个例子:
- Item A
- Item B
- Item C
- Item D
如果你的上下文是
./preceding-sibling::li
会选中- Item A 和
./preceding-sibling::li[1]就只会选中
Item C的前一个
li同级。
这种方法在处理那些结构上紧密相连,但又没有直接父子关系的元素时,简直是神器。比如,一个价格标签后面跟着一个货币符号,或者一个输入框前面紧跟着它的标签文本。
preceding-sibling 在实际网页抓取中有什么应用场景?
preceding-sibling轴在实际的网页抓取和数据提取中,简直是高频工具,尤其是在那些网页结构并不那么“规矩”的时候。
-
关联上下文信息: 很多网页设计为了视觉效果,会把相关联的数据放在同级元素里,而不是严格的父子结构。比如,你可能找到一个商品的描述,而它的标题或SKU信息却在它前面的一个同级
div
里。这时,你可以先定位到描述div
,然后用preceding-sibling::div[1]
来获取前面的标题。大号T恤$29.99纯棉,宽松版型...如果你定位到
//div[@class='product-price']
,想获取商品名,就可以用/preceding-sibling::div[1]
。 处理列表或表格的“前置”数据: 在一些复杂的表格或列表渲染中,某个单元格或列表项的数据可能依赖于它前面同级的某个标识符或分类。例如,一个表格行中的某个数据单元格,它的分类信息可能在它前面的一个同级
中。 动态内容与标签的关联: 网站上的表单元素经常是这样:一个
标签后面紧跟着一个或。当你想获取某个输入框的标签文本时,如果你能定位到输入框,就可以用preceding-sibling::label[1]
来获取其对应的标签。如果你定位到
//input[@id='password']
,想获取它的标签,直接/preceding-sibling::label[1]
就能拿到“密码:”。处理错误信息或提示: 有些表单验证错误信息会出现在对应的输入框之后,但有时候,为了布局,它会出现在输入框之前,且是同级。比如一个
提示错误,紧挨着它后面才是
input
。反过来,如果你定位到错误信息,想知道是哪个输入框出了问题,preceding-sibling
也能帮上忙。总之,
preceding-sibling
轴提供了一种非常灵活且强大的方式来逆向遍历和定位元素,尤其适用于那些在文档流中通过相对位置来定义相互关系的场景。它让你在面对不那么“整齐”的HTML结构时,也能游刃有余地提取所需数据。相关文章
sitemap.xml怎么生成 网站地图生成方法详解
怎么将Word文档(docx)转换为XML
XHTML和HTML5有什么区别 为什么要遵循XML的严格语法
Java如何避免JAXB生成xsi:type属性
XSD 1.1中的断言(assertion)是什么 如何使用
本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn
更多热门AI工具
更多相关专题
html版权符号html版权符号是“©”,可以在html源文件中直接输入或者从word中复制粘贴过来,php中文网还为大家带来html的相关下载资源、相关课程以及相关文章等内容,供大家免费下载使用。
616
2023.06.14
html在线编辑器html在线编辑器是用于在线编辑的工具,编辑的内容是基于HTML的文档。它经常被应用于留言板留言、论坛发贴、Blog编写日志或等需要用户输入普通HTML的地方,是Web应用的常用模块之一。php中文网为大家带来了html在线编辑器的相关教程、以及相关文章等内容,供大家免费下载使用。
656
2023.06.21
html网页制作html网页制作是指使用超文本标记语言来设计和创建网页的过程,html是一种标记语言,它使用标记来描述文档结构和语义,并定义了网页中的各种元素和内容的呈现方式。本专题为大家提供html网页制作的相关的文章、下载、课程内容,供大家免费下载体验。
470
2023.07.31
html空格html空格是一种用于在网页中添加间隔和对齐文本的特殊字符,被用于在网页中插入额外的空间,以改变元素之间的排列和对齐方式。本专题为大家提供html空格的相关的文章、下载、课程内容,供大家免费下载体验。
245
2023.08.01
html是什么HTML是一种标准标记语言,用于创建和呈现网页的结构和内容,是互联网发展的基石,为网页开发提供了丰富的功能和灵活性。本专题为大家提供html相关的各种文章、以及下载和课程。
2897
2023.08.11
html字体大小怎么设置在网页设计中,字体大小的选择是至关重要的。合理的字体大小不仅可以提升网页的可读性,还能够影响用户对网页整体布局的感知。php中文网将介绍一些常用的方法和技巧,帮助您在HTML中设置合适的字体大小。
506
2023.08.11
html转txthtml转txt的方法有使用文本编辑器、使用在线转换工具和使用Python编程。本专题为大家提供html转txt相关的文章、下载、课程内容,供大家免费下载体验。
312
2023.08.31
html文本框代码怎么写html文本框代码:1、单行文本框【<input type="text" style="height:..;width:..;" />】;2、多行文本框【textarea style=";height:;"></textare】。
426
2023.09.01
更多热门下载
更多相关下载
更多精品课程
更多最新文章
Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号


