使用xpath提取嵌套的微数据。

问题描述 投票:0回答:1

我试图使用xpath从schemma.org微数据中提取配方名称。

这是我想出的xpath。

//*[@itemtype="http://schema.org/Recipe"]//*[@itemprop="name" and not(ancestor::*[@itemtype!="http://schema.org/Recipe"])]

选出那个节点 itemprop="name" 节点内有 itemtype="http://schema.org/Recipe"的范围内),但忽略具有非重复项目类型的父节点。itemtype="http://schema.org/Recipe" 节点)。)

测试案例。

失败。

<div itemtype="https://schema.org/Thing">
  <div itemtype="http://schema.org/Recipe">
    <div>
      <div itemtype="http://schema.org/BreadcrumbList">
          <div itemprop="name">test1</div>
          <div itemprop="name">test2</div>
      </div>
      <div itemprop="name">Recipe Name</div>
    </div>
  </div>
</div>

失败: 失败。

<div itemtype="http://schema.org/Recipe">
  <div>
    <div itemtype="http://schema.org/BreadcrumbList">
      <div>
        <div itemprop="name">test1</div>
        <div>
            <div itemprop="name">test2</div>
        </div>
      </div>
    </div>
    <div>
      <div itemprop="name">Recipe Name</div>
    </div>
  </div>
</div>

Passes:

<div itemtype="http://schema.org/Recipe">
  <div>
    <div itemtype="http://schema.org/BreadcrumbList">
        <div itemprop="name">test1</div>
        <div itemprop="name">test2</div>
    </div>
    <div itemprop="name">Recipe Name</div>
  </div>
</div>

通过:

<div itemtype="http://schema.org/Recipe">
  <div itemprop="name">Recipe Name</div>
</div>

看来 ancestor::*[@itemtype!="http://schema.org/Recipe"] 是搜索所有的祖先,而不仅仅是搜索在 Recipe 节点。

如何从配方微数据中提取配方名称?https:/schema.orgRecipe。 当有潜在的嵌套 itemtypes 时?

xpath schema
1个回答
1
投票

如果我对你的问题理解正确,你想包括所有的 Recipe Name 而排除 testx,这种表达方式

//*[@itemtype="http://schema.org/Recipe"]//*[@itemprop="name"][not(..[@itemtype!="http://schema.org/Recipe"])]

或,更简单的版本。

//*[contains(@itemtype,"Recipe")]//*[@itemprop="name"][not(../@itemtype[not(contains(.,"Recipe"))])]

应该这样做。

编辑。

使用更新的样本。

//*[contains(@itemtype,"Recipe")]//*[@itemprop="name"][not(ancestor::*[@itemtype][1]/@itemtype[not(contains(.,"Recipe"))])]

这就是xpath的双重否定... ...


0
投票

另一个选择是(因为 Recipe name 似乎总是在最后一个节点)。

(//*[@itemtype="http://schema.org/Recipe"]//*[@itemprop="name"])[last()]

它通过了4个样本测试。

© www.soinside.com 2019 - 2024. All rights reserved.