用于查找没有匹配祖先的元素的Xpath表达式

时间:2014-10-14 16:16:34

标签: xpath xpath-1.0

我尝试使用xpath从页面中提取HTML5微数据。我基本上试图说"找到具有itemprop = name属性的嵌套节点,这些节点没有嵌套在另一个itemscope元素中(在任何深度)"。鉴于以下示例,我试图找到产品的名称(鞋子),但我不想要品牌名称(耐克)。

<div itemscope itemtype="http://schema.org/Product>
  <div itemscope itemtype="http://schema.org/Brand">
    <div itemprop="name">Nike</div> <!-- don't want this -->
  </div>
  <div itemprop="name">shoes</div> <!-- do want this -->
</div>

我可以通过使用类似// * [@ itemprop = name]的东西轻松找到itemprop = name元素,但这也会引入品牌名称。顺便说一下,示例中显示的元素可能嵌套在其他标签内,因此我不能简单地说&#34;其直接父级没有itemcope属性&#34;我相信可能会有一些与我可以使用的祖先相关的东西,但我对xpath不太了解。有什么想法吗?

2 个答案:

答案 0 :(得分:0)

请试一试:

//*[@itemprop = 'name' and not(ancestor::*[@itemscope][2])]

答案 1 :(得分:0)

找到最多只有一个itemprop="name"祖先的所有itemscope元素的单个表达式

//*[@itemprop = 'name'][not(ancestor::*[@itemscope][2])]

如果您想从一个特定的itemscope节点开始,并找到专门嵌套在 it 中的名称(而不是嵌套范围),那么您不能在一个XPath 1.0表达式。您必须首先提取其后代名称

.//*[@itemprop='name']

然后为每个人找到最近的itemscope祖先

ancestor::*[@itemscope][1]

并检查(在python端)该节点是否与您开始的节点相同。在XPath 2.0中,您可以使用

进行此操作
for $me in . return (.//*[@itemprop='name'][ancestor::*[@itemscope][1] is $me])

但1.0没有绑定变量的for $x in Y return Z结构,或is运算符来比较节点标识。