检查条件后在 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"
的元素的位置索引。
我有以下 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"
的元素的位置索引。