如何获取同一rowspan覆盖所有行下目标元素的XPath
跨行rowspan合并场景下的指定行XPath定位方案
测试样例代码
<table> <tbody> <tr> <td id="mainfield:1" rowspan="3">A1</td> <td ><span class="searching_for_this"> AA1</span></td> <td ><span class="not_searching_for_this">AA2</span></td> </tr> <tr> <td ><span class="searching_for_this"> AA3 </span></td> <td ><span class="not_searching_for_this">AA3 </span></td> </tr> <tr> <td ><span class="searching_for_this"> AA1 </span></td> <td ><span class="not_searching_for_this">AA4</span></td> </tr> <tr> <td id="main_field:2" rowspan="3">B1</td> <td ><span class="searching_for_this"> BB1</span></td> <td ><span class="not_searching_for_this">BB2</span></td> </tr> <tr> <td ><span class="searching_for_this"> AA1 </span></td> <td ><span class="not_searching_for_this">BB3 </span></td> </tr> <tr> <td ><span class="searching_for_this"> BB2 </span></td> <td ><span class="not_searching_for_this">BB3</span></td> </tr> </tbody> </table>
已知前提
- 跨行合并单元格(rowspan=3)所在行的文本内容为
A1 - 待查找目标元素类名为
searching_for_this,目标匹配文本为AA1 - 需求:获取
A1所在rowspan覆盖范围内,包含目标AA1元素的所有tr行节点,预期返回示例表格中的第一行和第三行
前期尝试失效原因
无跨行合并的单行场景下,直接定位主行后做相对路径搜索的方案无法覆盖合并对应的后续行;后续调整的前置同胞节点匹配XPath未返回结果,核心问题有两个:
- id属性匹配规则错误:第一行合并单元格的id为
mainfield:1,不存在main_field的下划线拼接,属性匹配条件不成立 - 匹配范围遗漏首行:逻辑仅判断前置同胞节点,没有把包含A1文本的合并起始行本身纳入匹配范围
可用XPath实现
//tr[ (. | preceding-sibling::tr[td[contains(@id, 'main') and @rowspan]][1]) [last()]/td[contains(text(), 'A1')] ][.//span[@class='searching_for_this' and contains(normalize-space(text()), 'AA1')]]
逻辑拆解
- 范围筛选:对遍历到的每一个tr节点,将节点自身和它前面最近的、携带
rowspan属性、id包含main的tr节点组成集合,取集合最后一个节点(如果当前tr是合并起始行,集合只有自身,取到的就是当前行;如果是合并覆盖的后续行,取到的就是最近的合并起始行),判断该节点文本是否包含A1,即可圈定A1对应rowspan覆盖的全部3行,自动排除B1分组的无关行 - 内容匹配:在圈定的A1分组行范围内,筛选内部存在类名为
searching_for_this、文本经normalize-space()去除前后空格后包含AA1的span元素的行,即可得到预期结果
补充:使用
normalize-space()是为了兼容示例中AA1这类前后带多余空格的文本场景,避免空格导致匹配失败
内容的提问来源于stack exchange,提问作者nck
相关产品推荐
相关产品推荐

