XPath轴用于定义从当前节点出发的导航方向,如child::、parent::、ancestor::等,结合节点测试和谓词可精准定位XML/HTML中的元素,提升数据提取效率。

在使用XPath进行XML或HTML文档解析时,选取节点是核心操作。除了基本的路径表达式(如//div、/html/body/p),XPath提供了丰富的“轴”(Axis)机制,用于定位与当前节点相关联的其他节点。掌握这些轴的用法,能让你更灵活、精准地抓取所需数据。
XPath轴定义了从当前节点出发,可以访问的节点方向和范围。每个轴代表一个特定的节点集合,比如父节点、子节点、祖先节点等。轴的基本语法为:
其中:
child、parent
div、*(所有元素)选取当前节点的直接子节点。
示例:
child::div:选择所有子级<div>元素child::*:选择所有子元素节点child::text():选择所有子文本节点简写:div 等价于 child::div
选取当前节点的父节点。
示例:
parent::*:选择父元素parent::div[@class="container"]:选择父节点是否为特定div
简写:.. 等价于 parent::*
选取当前节点的所有祖先节点(父、祖父、曾祖父等)。
示例:
ancestor::div:选择所有祖先中的div元素ancestor::*[1]:选择最近的一个祖先元素(即父节点)ancestor::body:检查是否在body内部选取当前节点的所有后代节点(子、孙、曾孙等)。
示例:
descendant::span:选择所有嵌套层级的span
div/descendant::input:在div内找所有input
简写:// 在路径中表示descendant::,如div//input
选取当前节点之后的同级节点。
示例:
following-sibling::li:选择后面所有的li
following-sibling::li[1]:选择下一个li兄弟h2/following-sibling::p[1]:h2后的第一个p
选取当前节点之前的同级节点。
示例:
preceding-sibling::li:前面所有li
li[3]/preceding-sibling::li[1]:第3个li前的第一个li
选取在当前节点之后的所有节点(按文档顺序,不一定是兄弟)。
示例:
h1/following::p:h1之后的所有p标签选取在当前节点之前的所有节点(按文档顺序)。
示例:
p/preceding::h1[1]:当前p之前最近的h1
选取当前节点本身。
示例:
self::div:如果当前节点是div,则选中or使用选取当前节点的属性。
示例:
attribute::id 或 @id:选择id属性值attribute::* 或 @*:选择所有属性简写:@ 是 attribute:: 的缩写
选取当前节点的命名空间节点(较少使用)。
示例:
namespace::*:列出所有命名空间声明包含当前节点及其所有祖先。
示例:
ancestor-or-self::div:如果当前是div或其祖先中有div,都会被选中包含当前节点及其所有后代。
示例:
descendant-or-self::a:当前如果是a或包含a后代,都匹配.//a | .[self::a]
合理组合轴和谓语,可以实现复杂定位:
//h3[text()="简介"]/following::p[1]
//*[@id="main"]/ancestor::div[@class="wrapper"]
//li[@class="active"]/preceding-sibling::li[1]
注意点:
following、preceding)按文档顺序排列,可能跨层级descendant::)可能较慢,尽量限定范围基本上就这些常用的轴。熟练掌握它们,能大幅提升你在爬虫、自动化测试或XML处理中的定位能力。多练习组合使用,你会发现XPath远比想象中强大。
以上就是XPath如何选取节点? 超全的XPath轴(Axis)用法总结的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号