如何基于lxml中的子元素选择父元素?

5

我有这段代码:

<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中的内容。那么如何获取父表格?

4个回答

7
如果t是这个XML片段的etree,那么您要查找的链接就是:
t.xpath('//a[@href = "http://exact url"]')[0]

接着,您可以使用祖先轴(ancestor axis)获取到 table

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

1
larsmans:你回答中的最后一行将获取所有表格中包含所需a元素的最外层table。我认为OP需要最内层的表格。 - Dimitre Novatchev
@DimitreNovatchev:你说得对,我应该取列表的最后一个元素。现在已经修复了,谢谢! - Fred Foo
Python。负索引从列表末尾开始。非常有用的功能。 - Fred Foo
是的,同意。所以,实际上,数组代表循环序列。 - Dimitre Novatchev
不完全正确。如果你超出索引范围,会抛出一个 IndexError 而不是循环回到开头。 - Fred Foo

2
一个纯XPath的解决方案。
用途:
(//a[@href = "http://exact url"])[1]/ancestor::table[1]

该XPath表达式选取XML文档中第一个a元素的第一个祖先table元素,其href属性值为字符串"http://exact url"

即使存在嵌套表格,此方法也可以准确地选择所需的a元素作为后代的每个表格元素,并选择最内层的table元素,而不是当前已接受的答案,该答案获得最外层的table祖先。


2

使用[]筛选表格。请注意,该属性是一个grandchild //table[.//@href="blah"]

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


1

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

你需要使用3个..才能到达表格元素。


啊,仍然不是一个特别漂亮或通用的解决方案。 - Fred Foo
同意,你的解决方案更优雅。 - beerbajay

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接