如何根据lxml中的孩子选择父母?

Posted

技术标签:

【中文标题】如何根据lxml中的孩子选择父母?【英文标题】:How to select parent based on the child in lxml? 【发布时间】:2012-03-17 07:17:25 【问题描述】:

我有这个代码:

<table cellspacing="1" cellpadding="1" border="0">
  <tbody>
   <tr>
    <td>Something else</td>
   </tr>
   <tr>
    <td valign="top">
      <a href="http://exact url">Something</a>
    </td>
    <td valign="top">Something else</td>
   </tr>
  </tbody>
</table>

我想找到表格但很难定位它(相同的代码被使用了 10 次)。但我知道 URL 中的内容。我怎样才能得到父表?

【问题讨论】:

【参考方案1】:

如果t 是这个 XML 的 sn-p 的 etree,那么您要查找的链接是

t.xpath('//a[@href = "http://exact url"]')[0]

从那里,您可以使用ancestor 轴到达table

t.xpath('//a[@href = "http://exact url"]/ancestor::table')[-1]

【讨论】:

larsmans:答案中的最后一行将获得所有表中最外层的table,其后代为所需的a 元素。我认为 OP 需要最里面的表。 @DimitreNovatchev:你说得对,我应该选择列表的最后一个元素。现已修复,谢谢! Python。负索引从列表的末尾开始。 非常有用的功能。 是的,同意。所以,实际上,数组代表循环序列。 不完全是。如果您索引到末尾,您会得到 IndexError 而不是环绕。【参考方案2】:

使用 [] 过滤表。注意属性是孙子//table[.//@href="blah"]

//a[@href="blah"]//ancestor::table

【讨论】:

【参考方案3】:

纯 XPath 解决方案。

使用

(//a[@href = "http://exact url"])[1]/ancestor::table[1]

这会选择XML文档中第一个a元素的第一个祖先table,其href属性的字符串值是字符串"http://exact url"

这提供了正确的 table 元素,即使在存在嵌套表的情况下,每个表都有所需的 a 元素作为后代。在这种情况下,上面的 XPath 表达式选择 innermost 例如 table -- 与当前接受的答案相反,它获得 outermost table 祖先。

【讨论】:

【参考方案4】:

//a[@href="http://exact url"]/../../..

您需要 3 个..s 才能到达表格元素。

【讨论】:

啊。不过,这不是一个特别漂亮或通用的解决方案。 同意,您的解决方案更优雅。

以上是关于如何根据lxml中的孩子选择父母?的主要内容,如果未能解决你的问题,请参考以下文章

反应孩子与父母的沟通问题

活动孩子的父母的复杂CSS选择器[重复]

活动孩子的父母的复杂CSS选择器[重复]

活动孩子的父母的复杂CSS选择器[重复]

活动孩子的父母的复杂CSS选择器[重复]

Jquery选择孩子但不是父母