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

XPath的
preceding-sibling
preceding-sibling
它的基本用法是:
当前节点路径/preceding-sibling::目标节点类型
举个例子,如果你有一个HTML结构:
<div> <p>这是第一段</p> <span>这是一个span</span> <p id="current">这是当前段落</p> <em>这是一个em</em> </div>
如果你当前选中的是
<p id="current">
preceding-sibling::p
<p>这是第一段</p>
preceding-sibling::*
<p>这是第一段</p>
<span>这是一个span</span>
它只关心“同级”和“之前”,不关心层级关系。这一点非常关键,因为它限定了查找的范围,让你的XPath表达式更加精确。很多时候,我们就是需要这种特定方向上的“邻居”信息。
这是个特别容易混淆的地方,但理解了就豁然开朗了。简单来说,
preceding-sibling
preceding
preceding-sibling
而
preceding
来个直观的例子:
<div id="container">
<p>外层段落1</p>
<div>
<span>内层span</span>
<p id="target">目标段落</p>
</div>
<p>外层段落2</p>
</div>如果我们的上下文节点是
<p id="target">
./preceding-sibling::*
<span>内层span</span>
div
<p id="target">
./preceding::*
<span>内层span</span>
<p>外层段落1</p>
<p id="target">
<p>外层段落1</p>
<p id="target">
<p id="target">
所以,如果你明确知道要找的是同一个父节点下的前一个或前几个兄弟元素,用
preceding-sibling
preceding
很多时候,我们并不想选择所有前面的同级节点,而是仅仅想抓取紧挨着当前节点的前一个同级节点。这在处理数据列表或者表单元素时特别常见。
要实现这个,其实很简单,就是在
preceding-sibling
[1]
例如:
当前节点路径/preceding-sibling::*[1]
这里的
*
[1]
preceding-sibling
[1]
如果你知道具体要找的元素类型,可以更精确:
当前节点路径/preceding-sibling::div[1]
div
举个例子:
<ul> <li>Item A</li> <li>Item B</li> <li id="current">Item C</li> <li>Item D</li> </ul>
如果你的上下文是
<li id="current">Item C</li>
./preceding-sibling::li
<li>Item A</li>
<li>Item B</li>
./preceding-sibling::li[1]
<li>Item B</li>
Item C
li
这种方法在处理那些结构上紧密相连,但又没有直接父子关系的元素时,简直是神器。比如,一个价格标签后面跟着一个货币符号,或者一个输入框前面紧跟着它的标签文本。
preceding-sibling
关联上下文信息: 很多网页设计为了视觉效果,会把相关联的数据放在同级元素里,而不是严格的父子结构。比如,你可能找到一个商品的描述,而它的标题或SKU信息却在它前面的一个同级
div
div
preceding-sibling::div[1]
<div class="product-name">大号T恤</div> <div class="product-price">$29.99</div> <div class="product-description">纯棉,宽松版型...</div>
如果你定位到
//div[@class='product-price']
/preceding-sibling::div[1]
处理列表或表格的“前置”数据: 在一些复杂的表格或列表渲染中,某个单元格或列表项的数据可能依赖于它前面同级的某个标识符或分类。例如,一个表格行中的某个数据单元格,它的分类信息可能在它前面的一个同级
<td>
动态内容与标签的关联: 网站上的表单元素经常是这样:一个
<label>
<input>
<textarea>
preceding-sibling::label[1]
<label for="username">用户名:</label> <input type="text" id="username"> <label for="password">密码:</label> <input type="password" id="password">
如果你定位到
//input[@id='password']
/preceding-sibling::label[1]
处理错误信息或提示: 有些表单验证错误信息会出现在对应的输入框之后,但有时候,为了布局,它会出现在输入框之前,且是同级。比如一个
<span>
input
preceding-sibling
总之,
preceding-sibling
以上就是XPath的preceding-sibling轴如何选择前同级?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号