我尝试使用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不太了解。有什么想法吗?
答案 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
运算符来比较节点标识。