-1

我正在使用以下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>

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

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

4

2 回答 2

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"前一个文本的元素的位置td。请注意,我们在这里使用count(preceding-sibling::*)+1获取包含文本的元素的位置索引"Statement Date"
于 2016-03-04T07:10:02.737 回答
1

你可以这样做:

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

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

于 2016-03-04T06:41:11.783 回答