如何用XPath获取动态页面列表项中带文本的最后后代超链接?
如何用XPath提取动态列表中带文本的目标链接?
问题场景
页面为动态生成,包含大量class为listitem的列表项,每个列表项内的超链接数量不固定(1-2个),链接的嵌套层级每次刷新都会变化。核心需求是提取每个列表项中包含可见文本的目标链接(示例中对应user2、user3、user4、user6的链接),排除无文本的空链接。
示例HTML代码:
<div class="listitem"> <div> <a href="https://www.testpage/user1"> </div> <div> <a href="https://www.testpage/user2"> <span> <div>user2</div> </span> </a> </div> </div> <div class="listitem"> <div> <a href="https://www.testpage/user3"> <div>user3</div> </a> </div> </div> <div class="listitem"> <div> <div> <a href="https://www.testpage/user4"> <span> <span>user4</span> </span> </a> </div> </div> </div> <div class="listitem"> <div> <div> <div> <a href="https://www.testpage/user5" /> </div> </div> <div> <a href="https://www.testpage/user6"> <div> <div>user6</div> </div> </a> </div> </div> </div>
之前尝试的div/a[last()]会返回全部6个链接,(div/a)[last()]仅返回最后一个链接,都不符合需求。
解决方案
方案1:提取每个列表项中带文本的最后一个链接
直接针对“每个列表项至少有一个带文本链接”的规则,精准筛选:
//div[@class='listitem']//a[normalize-space(text()|.//text())][last()]
//div[@class='listitem']:定位到每个列表项容器//a:遍历容器内所有嵌套层级的a标签[normalize-space(text()|.//text())]:筛选出包含非空文本的a标签(不管文本在多少层后代元素里)[last()]:在每个列表项的符合条件的a标签中,取最后一个(对应示例中每个listitem的目标链接)
方案2:匹配href末尾与文本内容一致的链接
如果链接的href末尾(如userX)和自身文本完全对应,可用这个更精准的匹配:
//div[@class='listitem']//a[normalize-space(substring-after(@href, 'https://www.testpage/')) = normalize-space(text()|.//text())]
substring-after(@href, 'https://www.testpage/'):截取href中域名后的部分(比如user2)normalize-space(...):去除文本两端的空格、换行,避免格式差异导致匹配失败- 对比截取的
href部分和a标签的所有文本内容,匹配成功的就是目标链接
内容的提问来源于stack exchange,提问作者Manny_user3297459
相关产品推荐
相关产品推荐

