3

我正在尝试使用 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 元素,但这也会引入品牌名称。顺便说一句,示例中显示的元素可能嵌套在其他标签中,所以我不能简单地说“其直接父级没有 itemscope 属性”我相信可能有一些与我可以使用但我不知道的祖先有关的东西关于xpath的足够了。有任何想法吗?

4

2 回答 2

4

查找最多具有一个祖先的所有itemprop="name"元素的单个表达式将是itemscope

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

如果您想从一个特定itemscope节点开始并找到专门嵌套在其中的名称(而不是嵌套范围),那么这不是您可以在一个 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比较节点身份的运算符。

于 2014-10-14T16:41:39.137 回答
1

请试一试:

//*[@itemprop = 'name' and not(ancestor::*[@itemscope][2])]
于 2014-10-14T16:30:43.037 回答