3 回答

TA贡献1943条经验 获得超7个赞
根据示例输出,您似乎想要获取包含指定文本的元素one
。您的描述说您想要该节点的父节点。
基于此假设,您可以使用以下XPath获得所需的节点:
//*[contains(text(), 'one')]
如果您确实想要此节点的父级,则可以执行
//*[child::*[contains(text(), 'one')]]
顺便说一句,如您所见,我使用谓词来获取节点,因此我过滤了XML节点。在我看来,这是更合乎逻辑和更易理解的方法,因为它基本上是说给我所有满足给定条件的节点,而不是说给我所有条件的输出,然后从这一点开始搜索实际所需的输出。但是您也可以执行以下操作,以更好地匹配您提出的解决方案:
//text()[contains(., 'one')]/parent::*

TA贡献1775条经验 获得超11个赞
>>> root.xpath("//*[contains(child::*/text(), 'one')]") # why empty parent?
[]
该XPath表达式选择第一个孙文本节点包含“一个”的每个元素。的第一个参数contains()应为字符串,因此XPath接受结果中的第一个节点child::*/text()并采用其字符串值。由于没有元素的文本节点的第一个孙子节点包含“一个”,因此答案是空的节点列表。
>>> root.xpath("//*[contains(text(), 'one')]")
# i expected to have a list with two elements td and div
[<Element td at 0x280b600>]
出于相同的原因,此XPath表达式选择其第一个文本节点子代包含“一个”的所有元素。这就是为什么<td>选择<div>而不选择的原因:div的包含“一个”的子文本节点不是其第一个子文本节点。
>>> root.xpath("//*[child::*[contains(text(), 'one')]]")
# if parent: expected tr and div,
# if not parent expected table or div, still missing one
[<Element tr at 0x2821f30>]
这面临着与先前表达式相同的限制。
您是否尝试过@dirkk提出的最后一个解决方案,
//text()[contains(., 'one')]/parent::*
那应该避免将多个节点作为第一个参数传递给您的问题contains()。
添加回答
举报