Найти определенную позицию элемента в XPath после проверки условия
У меня есть следующий 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')])]
но это не работает
2 ответа
Это один из возможных способов: (отформатирован для удобства чтения)
//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"
Вот.
Вы можете сделать это следующим образом:
//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>
,