XPath:后代,但不是遍历此节点

时间:2013-07-18 11:24:03

标签: xpath lxml traversal

我有一个节点树,坦白说是一团糟。

|-...
|-cat
\-dog
   |- dog *
   |   |- chicken
   |   |     \- cat !
   |   \- cat !
   |         \- cat !
   |             \- dog
   |                 |- cat
   |                 \- ...
   |- cat
   |- dog
   |   \- cat
   \- ...

鉴于我选择了带星号的“狗”节点,我怎样才能选择那些最近的“狗”祖先的猫(即那些带有感叹号的猫)

等效地,我怎样才能获得可以在不遍历另一个狗节点的情况下到达的节点的cat后代?

我正在使用lxml,目前有一个错误的解决方案,涉及通过drop_tree()所有狗节点断开图形。

1 个答案:

答案 0 :(得分:1)

您可以使用EXSLT的设置扩展程序:http://www.exslt.org/set/。它们在您的XPath表达式中使用lxml namespaces={"set": "http://exslt.org/sets"}中可用。

然后您可以执行类似

的操作
asteriskeddog.xpath("set:difference(.//cat, .//dog/cat)",
    namespaces={"set": "http://exslt.org/sets"})

表示当前节点下的所有cat个元素,除了当前节点下的dog元素下的元素。我在使用嵌套itemscope的一些微数据解析中使用了这个技巧itemprop元素