xpath - 选择前面所有 sibling 的XPATH仅选择第一个?我使用的软件有局限性吗?

标签 xpath

我有一个简单的表,试图从中解析数据,但在选择适当的元素时遇到了麻烦。该表的表示如下。带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-siblingfollowing-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”文本的所有行。我使用的软件是否有问题?

注意:我使用的软件不单独支持precedingfollowing,仅支持-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/

相关文章:

xpath - Camel Apache : xpath to extract some value out of received XML

xml - 如何用xmllint/xpath解析出不同元素的几个属性的值?

xpath - 使用 XPath 查找节点的位置

javascript - 使用 XSLT 如何确保表头仅打印一次

xml - 在 Hive 中解析 xml 时出错

Python Scrapy - 从多个网站 URL 中抓取数据

xpath - 使用 XPath 查找节点的位置

java - 搜索字符串,然后使用 Selenium 单击父 DIV

xml - 获取没有特定祖先 xml xpath 的节点

symfony - XPath:使用相对路径获取值(PHP、Symfony、DOMCrawler)错误