使用 XPath,我如何 select 只有在链接兄弟元素下存在特定子元素的链接

Using XPath, how do I select only the links that have a particular child present under the links sibling element

如何使用以下标准仅 select 中间安装名称?


在 table 中,我有多个 table 行。在这些 table 行的内部是一个 link(在 内部),其中包含 URL 和特定安装的名称,可以很容易地 select 编辑:

//td[contains(@class, 'install-name')]/a/text()

我不想 select 所有安装名称,我只想 select 锁定的安装。只有锁定安装包含位于 links 兄弟元素内的此元素。

//div[@class="install-details"]/span/i[contains(@class, 'password-protected')]

这里是 HTML:

<tr class="install odd" role="row">
    <td class="install-name sorting_1" data-sort="demo"><a href="/installs/demo">demo</a>
        <div class="install-details">
        <span>

        </span> 
        <span class="php-version">

        </span>
        </div>
    </td>
</tr>
<tr class="install even" role="row">
    <td class="install-name sorting_1" data-sort="adam">
        <a href="/installs/adam">adam</a>
        <div class="install-details">
            <span>
                <i class="install-status-icon password-protected fa fa-lock" title="Password Protected"></i>
            </span>
            <span class="php-version">

            </span>
        </div>
    </td>
</tr>
<tr class="install odd" role="row">
    <td class="install-name sorting_1" data-sort="amy">
        <a href="/installs/amy">amy</a>
        <div class="install-details">
                <span>

                </span>
                <span class="php-version">

                </span>
        </div>
    </td>
</tr>

如何使用上述标准仅 select 中间安装名称?

编辑:这是一个可以玩的 CodePen https://codepen.io/anon/pen/QvEbba

您可以将第二个 XPath 用作第一个 XPath 的附加谓词([] 中的表达式),如下所示:

//td[contains(@class, 'install-name')]
    [div[@class="install-details"]/span/i[contains(@class, 'password-protected')]]
 /a/text()

xpath demo

注意第二个谓词,它将结果限制为那些包含 'password-protected' 信息的 td

如何向后遍历 HTML。

//i[contains(@class, 'password-protected')]/parent::span/parent::div[@class='install-details']/preceding-sibling::a/text()