如何根据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中的孩子选择父母?的主要内容,如果未能解决你的问题,请参考以下文章