我试图使用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 时?
如果我对你的问题理解正确,你想包括所有的 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的双重否定... ...
另一个选择是(因为 Recipe name
似乎总是在最后一个节点)。
(//*[@itemtype="http://schema.org/Recipe"]//*[@itemprop="name"])[last()]
它通过了4个样本测试。