我有一个节点树,坦白说是一团糟。
|-...
|-cat
\-dog
|- dog *
| |- chicken
| | \- cat !
| \- cat !
| \- cat !
| \- dog
| |- cat
| \- ...
|- cat
|- dog
| \- cat
\- ...
鉴于我选择了带星号的“狗”节点,我怎样才能选择那些最近的“狗”祖先的猫(即那些带有感叹号的猫)
等效地,我怎样才能获得可以在不遍历另一个狗节点的情况下到达的节点的cat后代?
我正在使用lxml,目前有一个错误的解决方案,涉及通过drop_tree()
所有狗节点断开图形。
答案 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
元素