锚元素的XPath不在某个父元素中?

时间:2018-03-18 01:34:05

标签: python html xml xpath lxml

使用xpath,如何从第二段获取除斜体之外的所有锚标签? (问题和示例已经简化。想象一下包含多个<p><a>的常规HTML页面。

<html><body>
    <p>
        <a href="a.html">A</a>
        <b><a href="b.html">B</a></b>
        <i><a href="c.html">C</a></i>
    </p>
    <p>
        <b><a href="e.html">E</a></b>
        <a href="f.html">F</a>
        <i><a href="g.html">G</a></i>
    </p>
</body></html>

应该得到:

<a href="e.html">
<a href="f.html">

我有什么:

root.xpath('//body//p')[1].xpath('a[not(self::i)]')

我只是得到:

`<a href="f.html">`

2 个答案:

答案 0 :(得分:2)

尝试使用以下XPath获取所需的输出:

//p[2]//a[not(parent::i)]

答案 1 :(得分:1)

作为@Andersson commented,我们不清楚你的a元素应该在哪里结束。

假设您的a元素意味着自我关闭,

<html><body>
    <p>
      <a href="a.html"/>
      <b><a href="b.html"/></b>
      <i><a href="c.html"/></i>
    </p>
    <p>
      <b><a href="e.html"/></b>
      <a href="f.html"/>
      <i><a href="g.html"/></i>
    </p>
</body>
</html>

然后是这个XPath,

/html/body/p[2]//a[not(parent::i)]

选择其父级不是a元素的第二段的所有i后代:

<a href="e.html"/>
<a href="f.html"/>

信用:感谢@Andersson的纠正。请upvote his answer。感谢。