0

我有一棵节点树,坦率地说是一团糟。

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

鉴于我选择了带星号的“狗”节点,我如何只选择那些它是最近的“狗”祖先的猫(即那些有感叹号的猫)

等效地,我怎样才能只获得节点的那些猫后代,而无需遍历另一个狗节点?

我在 lxml 中工作,目前有一个糟糕的解决方案,涉及通过drop_tree()-ing 所有狗节点来断开图形。

4

1 回答 1

1

您可以使用 EXSLT 的设置扩展:http ://www.exslt.org/set/ 。它们可用于lxmlnamespaces={"set": "http://exslt.org/sets"}的 XPath 表达式。

然后你可以做类似的事情

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

意思是“cat当前节点下的所有元素,除了当前节点下dog元素下的元素。我在一些嵌套itemscopeitemprop元素的微数据解析中使用了这个技巧

于 2013-07-18T15:28:10.033 回答