如何用XPath提取同名元素多个值?需获取最后两个dd标签的内容
XPath提取方案
核心需求
提取目标<dl>下最后两个<dd>元素的文本,处理后拼接为Talstrasse 2A 01816 Berggiesshübel。
实现方案
方案1:分两次提取(兼容所有XPath版本)
先基于类名定位目标<dl>(比绝对层级定位稳定性更高),再分别取最后两个<dd>:
- 提取街道信息(倒数第二个
<dd>)://dl[contains(normalize-space(@class), "dl-horizontal event-detail-dl")]/dd[position() = last() - 1] - 提取邮编地址(倒数第一个
<dd>)://dl[contains(normalize-space(@class), "dl-horizontal event-detail-dl")]/dd[last()]
拿到结果后手动处理文本:去掉街道末尾的逗号、清除两段文本前后的空白,再拼接即可得到目标结果。
方案2:单条XPath直接返回拼接结果(支持XPath 2.0及以上版本)
如果运行环境支持XPath 2.0,可以一步完成提取、清洗、拼接操作:concat(normalize-space(translate(//dl[contains(normalize-space(@class), "dl-horizontal event-detail-dl")]/dd[last()-1], ',', '')), ' ', normalize-space(//dl[contains(normalize-space(@class), "dl-horizontal event-detail-dl")]/dd[last()]))
表达式逻辑说明:
- 用
translate方法删除街道文本末尾的逗号 - 用
normalize-space方法清除两段文本前后的换行、多余空格 - 用
concat方法拼接两段文本,中间补充空格分隔
原有自动生成XPath的问题
- 写死了全量DOM层级,页面结构稍有变动就会失效
- 固定取第6个
<dd>,如果前面的<dt><dd>对数发生变化,下标就会偏移,用last()做相对定位兼容性更强
内容的提问来源于stack exchange,提问作者alphicreative
相关产品推荐
相关产品推荐

