检查条件后在 XPath 中查找特定元素位置

Find specific element position in XPath after checking a condition

我有以下 html 我正在使用:(这里有一部分)

<table class="detailTable">
  <tbody>
    <tr>
      <td class="detailTitle" align="top">
        <h3>Credit Limit:</h3>
        <h3>Current Balance:</h3>
        <h3>Pending Balance:</h3>
        <h3>Available Credit:</h3>
      </td>
      <td align="top">
        <p>7.77</p>
        <p>.77</p>
        <p>.77</p>
        <p>7.77</p>
      </td>
      <td class="detailTitle">
        <h3>Last Statement Date:</h3>
        <h4>Payment Address</h4>
      </td>
      <td>
        <p>   05/19/2015  </p>
        <p class="attribution">
      </td>
    </tr>
  </tbody>
</table>

我需要先检查“Statement Date”是否存在,然后找到它的位置。然后获取它在相应 <p> 标记中的值。我需要使用 XPath 执行此操作。有什么建议吗?

到目前为止我尝试使用 //table[@class='detailTable'][1]//td[2]//p[position(td[contains(.,'Statement Date')])] 但它不起作用。

你可以这样做:

//table[@class='detailTable'][1]//td[@class="detailTitle" and contains(./h3, 'Statement Date')]/following-sibling::td[1]/p[1]/text()

这将找到包含 Statement Date 标题的 <td>,并在其后立即获取 <td>。然后获取那个<td>.

中第一个p的文本内容

这是一种可能的方式:(为了便于阅读而格式化)

//table[@class='detailTable']
//tr
/td[*[contains(.,'Statement Date')]]
/following-sibling::td[1]
/*[position() 
      = 
    count(
        parent::td
        /preceding-sibling::td[1]
        /*[contains(.,'Statement Date')]/preceding-sibling::*
    )+1
  ]

解释:

  • ..../td[*[contains(.,'Statement Date')]] :从开始到这部分,XPath 将找到 td 元素,其中至少有一个子元素包含文本"Statement Date"
  • /following-sibling::td[1] :从之前匹配的 td,导航到最近的后续兄弟 td ...
  • /*[position() = count(parent::td/preceding-sibling::td[1]/*[contains(.,'Statement Date')]/preceding-sibling::*)+1] : ...并且 return 位置的子元素等于 包含文本的元素的位置 "Statement Date"在前面td。请注意,我们在这里使用 count(preceding-sibling::*)+1 来获取包含文本 "Statement Date" 的元素的位置索引。