我有一个简单的表,试图从中解析数据,但在选择适当的元素时遇到了麻烦。该表的表示如下。带class="subgroup-head"
的2个TR是全角列,而其他所有TR(class="odd" or "even"
)都包含4列。
<TABLE class="transfers table">
<TBODY>
<TR class="subgroup-head">
<TH>Transfers In</TH>
<TR class="odd">
<TR class="even">
<TR class="odd">
.
.
.
.
.
<TR class="subgroup-head">
<TH>Transfers Out</TH>
<TR class="odd">
<TR class="even">
<TR class="odd">
.
.
.
.
我正在尝试选择TR后面的所有带有“ Transfers In”文本的表行,直到TR带有“ Transfers Out”文本。我认为可以使用
preceding-sibling
和following-sibling
轻松地做到这一点。然而,//TABLE[@class='transfers table']/TBODY[1]/TR[preceding-sibling::TR[contains(text(),'Transfers Out')]]
仅选择具有class ='subgroup-head'和文本“ Transfers Out”的TR之后的第一个TR,并且
//TABLE[@class='transfers table']/TBODY[1]/TR[following-sibling::TR[contains(text(),'Transfers Out')]]
仅选择class =“ subgroup-head”和文本“ Transfers In”的TR。我假设两者都将选择TR之前或之后带有“ Transfers Out”文本的所有行。我使用的软件是否有问题?
注意:我使用的软件不单独支持
preceding
或following
,仅支持-sibling。我用count方法尝试了变体xpath,但它也提供了相同的结果
//TABLE[@class='transfers table']/TBODY[1]/TR[count(preceding-sibling::TR[contains(text(),'Transfers Out')])=1]
最佳答案
问题出在函数调用contains(text(),'Transfers Out')
上。 text()
返回一个包含subgroup-head
节点的所有文本节点子级的节点集。这将转换为在contains
中使用的字符串,这意味着将使用集合中第一个节点的值。在这种情况下,这是元素前面的仅空白节点,不匹配。
如果改用当前上下文元素(即.
),它将起作用。元素的字符串值是其所有后代文本节点的字符串值的串联,这是您想要的。
因此,您需要两个查询:
//TABLE[@class='transfers table']/TBODY[1]/TR[preceding-sibling::TR[contains(.,'Transfers Out')]]
和
//TABLE[@class='transfers table']/TBODY[1]/TR[following-sibling::TR[contains(.,'Transfers Out')]]
(此第二行还将包括您可能要过滤掉的
Transfers In
前导行)。
关于xpath - 选择前面所有 sibling 的XPATH仅选择第一个?我使用的软件有局限性吗?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/46429983/