我有一个简单的表格,我试图解析数据,而且我在选择正确的元素时遇到了麻烦。该表的表示如下。带有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的所有表格行以及文本&#39; Transfers In&#39;通过&#39;转移到TR的TR直到文本。我想我可以使用preceding-sibling
和following-sibling
轻松完成此操作。但是,
//TABLE[@class='transfers table']/TBODY[1]/TR[preceding-sibling::TR[contains(text(),'Transfers Out')]]
只选择TR之后的第一个TR,其中class =&#39; subgroup-head&#39;和文字&#34;转出&#34;和
//TABLE[@class='transfers table']/TBODY[1]/TR[following-sibling::TR[contains(text(),'Transfers Out')]]
仅选择TR = class =&#39; subgroup-head&#39;和文本&#34;转移&#34;。我假设两者都会在TR之前或之后选择所有行,并且“转出”&#39;文本。这是我使用的软件的问题吗?
注意:我使用的软件不仅仅支持preceding
或following
,只支持-sibling。
我尝试了一种带有count方法的变体xpath,但它也提供了相同的结果
//TABLE[@class='transfers table']/TBODY[1]/TR[count(preceding-sibling::TR[contains(text(),'Transfers Out')])=1]
答案 0 :(得分:0)
我找到了自己的答案,选择2个不同的元素组的2个x路径是
//TABLE[@class='transfers table']/TBODY[1]/TR[@class='odd' or @class='even'][following-sibling::TR[contains(text(),'Transfers out')]]
和
//TABLE[@class='transfers table']/TBODY[1]/TR[@class='odd' or @class='even'][preceding-sibling::TR[contains(text(),'Transfers out')]]
答案 1 :(得分:0)
问题在于函数调用contains(text(),'Transfers Out')
。 text()
返回包含subgroup-head
节点的所有文本节点子节点的节点集。这将转换为在contains
中使用的字符串,这意味着使用集合中 first 节点的值。在这种情况下,它是元素之前的空白节点,它不匹配。
如果您使用当前的上下文元素(即.
),它将起作用。元素的字符串值是其所有后代文本节点的字符串值的串联,这是您想要的。
因此,您需要的两个查询是:
//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
行。