xpath中的|运算符是节点集联合操作符,用于将多个xpath表达式匹配的节点集合并为一个无重复的集合,例如//h1 | //h2可同时选取所有h1和h2元素,它操作的是结果集的并集,而不同于and/or这类在谓词中对单个节点进行条件判断的布尔操作符,因此|适用于跨结构收集分散但逻辑相关的数据,在处理页面布局不一致、a/b测试或多路径信息聚合时尤为高效,但需注意其可能带来的性能开销、结果顺序不确定性及调试复杂性,合理使用可显著提升数据抓取的灵活性与鲁棒性。

XPath中的
|
XPath的
|
举个例子,假设你想抓取一个页面上所有的标题,但这些标题可能分散在
<h1>
<h2>
<h3>
//h1 | //h2 | //h3
product-name
div
id
featured-item
p
//div[@class='product-name'] | //p[@id='featured-item']
在我看来,这个运算符的强大之处在于它极大地提高了XPath表达式的灵活性和表达力。它让我们可以跨越结构差异,将逻辑上相关但物理位置分散的数据点聚合起来,为后续的数据处理打下基础。它不是在筛选,而是在“收集”——收集所有符合任一条件的节点。
|
这是个特别好的问题,我个人在初学XPath时也曾有过类似的疑惑。
|
and
or
简单讲,
|
//a | //p
<a>
<p>
而
and
or
[]
比如,
//div[contains(@class, 'product') and @id='featured']
div
div
class
product
id
featured
div
and
再看
//a[starts-with(@href, '/blog') or contains(@href, 'archive')]
<a>
href
/blog
archive
or
所以,核心区别在于:
|
and
or
|
|
一个很常见的场景是处理页面结构的不确定性。比如,一个新闻网站的标题,有时可能在
<h1>
<h2>
<h3>
//h1[@class='article-title'] | //h2[@class='article-title'] | //h3[@class='article-title']
再比如,合并来自不同父级元素下的相似数据。假设一个商品详情页,商品名称可能在一个
div
h1
section
h3
//div[@class='main-product']/h1/text() | //section[@class='related-products']//h3/text()
另一个我经常用到的场景是处理A/B测试或网站改版带来的元素路径变化。网站可能会测试两种不同的布局,导致同一个逻辑上的元素,在DOM树中的路径有所不同。或者,网站改版后,原来是
div[@id='content']
section[@class='main-content']
//div[@id='content'] | //section[@class='main-content']
甚至,在某些情况下,为了获取一个元素的特定属性或文本,但其位置不固定,
|
href
src
//a/@href | //img/@src
总的来说,
|
|
尽管
|
首先是性能问题。当你的XPath表达式变得非常复杂,尤其是包含多个
//
|
//
|
|
//
其次,关于结果集的顺序。XPath 1.0规范并没有强制规定
|
h1
h2
再来就是误用或滥用。有时,我们可能会不自觉地用
|
class
intro
summary
p
//p[@class='intro' or @class='summary']
//p[@class='intro'] | //p[@class='summary']
p
p
最后,调试复杂表达式也是一个挑战。当一个XPath表达式变得很长,包含多个
|
总而言之,
|
以上就是XPath的|运算符如何合并多个结果集?的详细内容,更多请关注php中文网其它相关文章!
每个人都需要一台速度更快、更稳定的 PC。随着时间的推移,垃圾文件、旧注册表数据和不必要的后台进程会占用资源并降低性能。幸运的是,许多工具可以让 Windows 保持平稳运行。
Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号