使用XPath获取Part-time后内容返回空,请求错误排查
问题:XPath无法获取Part-time标签后的文本内容
先把你的场景梳理下:
你有这段HTML结构:
<div class="sys_key-facts"> <p> <strong>Full-time </strong>1 year<br> <strong>Part-time</strong> 2 years </p> </div>
想要提取<strong>Part-time</strong>后面的2 years,但你写的XPath返回了空值:
//div[@class="sys_key-facts"]/p[strong[contains(text(), "Part-time")]][preceding-sibling::br]/text()
你的XPath错在哪?
咱们一步一步拆解问题:
[preceding-sibling::br]完全错误:这个条件是在筛选<p>标签,要求<p>有一个前置的同级<br>节点,但你的<br>是在<p>标签内部的,<p>的同级根本没有<br>元素,这直接把唯一符合条件的<p>给排除了,自然找不到任何节点。- 就算去掉这个错误条件,直接用
//div[@class="sys_key-facts"]/p[strong[contains(text(), "Part-time")]]/text(),也会返回<p>下所有的文本节点(包括1 year和各种换行空格),不是你要的目标内容。
正确的XPath写法
给你几种靠谱的实现方式,按需选择:
方式1:精准定位目标<strong>后取后续文本
//div[@class="sys_key-facts"]/p/strong[contains(text(), "Part-time")]/following-sibling::text()[1]
这个逻辑是:先找到包含"Part-time"的<strong>标签,然后取它第一个紧随其后的同级文本节点,就是你要的2 years。如果担心文本前后有多余空格,可以用normalize-space()处理掉:
normalize-space(//div[@class="sys_key-facts"]/p/strong[contains(text(), "Part-time")]/following-sibling::text()[1])
方式2:利用固定结构定位(适合页面结构稳定的场景)
如果这个<p>里的<strong>顺序永远是Full-time在前、Part-time在后,那可以直接取第二个<strong>的后续文本:
//div[@class="sys_key-facts"]/p/strong[2]/following-sibling::text()[1]
方式3:从文本节点反向匹配前置<strong>
//div[@class="sys_key-facts"]/p/text()[preceding-sibling::strong[contains(text(), "Part-time")]]
这个逻辑是:筛选<p>下的所有文本节点,只保留那些前面有包含"Part-time"的<strong>的节点,精准命中目标文本。
内容的提问来源于stack exchange,提问作者Alpha Romeo
相关产品推荐
相关产品推荐

