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

时间:2016-03-03 22:14:00

标签: html xpath xpathquery

我有以下我正在使用的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>$677.77</p>
        <p>$7.77</p>
        <p>$7.77</p>
        <p>$677.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>

我需要先检查&#34; Statement Date&#34;存在,然后找到它的位置。然后获取相应<p>标记中的值。我需要使用XPath来做到这一点。有什么建议吗?

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

2 个答案:

答案 0 :(得分:1)

你可以这样做:

<td>

这将找到包含Statement Date标题的<td>,并在其后立即获得p。然后,它会获取<td>中第一个{{1}}的文本内容。

答案 1 :(得分:1)

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

//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] :...并返回位置上的子元素等于上一个{{包含文本"Statement Date" 的元素的位置1}}。请注意,我们使用td来获取包含文本count(preceding-sibling::*)+1的元素的位置索引。