悠悠楠杉
XPath合并查询的实战技巧:高效抓取多维度数据
XPath合并查询的实战技巧:高效抓取多维度数据
一、|运算符的本质解析
XPath中的竖线运算符(|)实际上执行的是集合合并操作。当我们在网页抓取中使用表达式如//div[@class="title"] | //meta[@name="keywords"]
时,引擎会分别执行两个子路径查询,然后将结果合并为无序节点集。值得注意的是,合并后的节点顺序通常遵循文档中的出现顺序,但不同解析器可能略有差异。
二、多结果集合并的典型场景
1. 跨层级内容聚合
xpath
//h1[contains(@class,'article-title')] |
//div[@id='content']//p[not(@class='footer')]
2. 分散元数据采集
xpath
//meta[@property='og:title'] |
//meta[@name='description'] |
//link[@rel='canonical']
3. 异构数据源整合
某新闻网站案例中,正文分散在多个div区块:
xpath
(//div[@class='news-content']//p |
//div[@class='additional-info']/ul/li[position()<3])
三、实战中的优化策略
- 性能调优:复杂查询可拆分为多个步骤,先获取父节点再二次查询
- 去重处理:合并后使用
distinct-values()
函数(XPath 2.0+) - 精确控制:通过位置谓词限制结果范围,如
(//h2|//h3)[position()<=5]
四、常见问题解决方案
问题场景:合并后节点顺序混乱
解决方案:使用/ancestor::
轴定位共同祖先节点,重建文档顺序
问题场景:需要保留来源信息
代码示例:
xpath
for $node in (//title|//meta[@name])
return
concat(local-name($node), ': ', $node/@content)
五、高级应用技巧
条件合并:配合谓词表达式实现智能合并
xpath //*[self::h2 or self::h3][@data-important='true']
命名空间处理:合并不同命名空间的节点时需声明前缀
xpath //xhtml:div | //custom:widget
动态路径构建:通过变量组合查询路径
xpath let $paths := ('//header', '//footer') return xpath:eval(string-join($paths, '|'))