如何以有效的方式嵌套Microdata(使用Schema.org)?

时间:2014-06-20 22:38:12

标签: schema.org microdata

我有一个名称和地址搜索结果页面,我正在尝试使用Schema.org添加微数据标记。在我看来,名称(" familyname"和" givenname")属于schema.org/people,而地址详细信息(例如" addresscountry")属于到schema.org/PostalAddress。

所以我在页面顶部声明了schema.org/people,然后我在schema.org/people参考中包含实际名称 - 似乎spandiv是同样被忽视,因此区别似乎并不重要。

当我向Google提交该页面时,它抱怨说:

  

错误:页面包含属性" familyname"这不属于   架构。错误:页面包含属性" givenname"这不属于   架构。错误:页面包含属性" familyname"不是   架构的一部分。错误:页面包含属性" givenname"是的   不是架构的一部分。

并且使用Bing的结构化数据工具进行类似的测试,结果只会忽略名称。任何人都知道我在这里做错了什么?

这是一段代码段。就在结果表的前面:

<div id="center" itemscope itemtype="http://schema.org/PostalAddress">

然后是表格本身的摘录:

<tr><td><div itemprop="familyName" itemscope itemtype="http://schema.org/person">Macdonold</div></td><td><div itemprop="givenName" itemscope itemtype="http://schema.org/person">Carol</div></td><td><span itemprop="addressCountry">Australia</span></td><td><span itemprop="telephone">0439213078</span></td><td><div class="arrow"></div></td></tr>
<tr><td colspan="5"><h4>Additional information</h4>
<ul>
<li>Occupation: <span class="resultdata" itemprop="contactType">Secretary</span></li>
<li>Address: <span class="resultdata" itemprop="streetAddress">324 Coombe Street</span></li>
<li>City: <span class="resultdata" itemprop="addressLocality">Nangwarry</span></li>
<li>State / Region: <span class="resultdata" itemprop="addressRegion">South Australia</span></li>
</ul>
</td></tr>
<tr><td><div itemprop="familyName" itemscope itemtype="http://schema.org/person">Hughes</div></td><td><div itemprop="givenName" itemscope itemtype="http://schema.org/person">Frank</div></td><td><span itemprop="addressCountry">UK</span></td><td><span itemprop="telephone">07369884589</span></td><td><div class="arrow"></div></td></tr>
<tr><td colspan="5"><h4>Additional information</h4>
<ul>
<li>Occupation: <span class="resultdata" itemprop="contactType">Chef</span></li>
<li>Address: <span class="resultdata" itemprop="streetAddress">22 Melrose Place</span></li>
<li>City: <span class="resultdata" itemprop="addressLocality">London</span></li>
<li>State / Region: <span class="resultdata" itemprop="addressRegion">Greater London</span></li>
</ul>

</td></tr>

编辑: 我似乎&#39;通过重新排序名称周围的标记来解决它。请参阅以下代码段:

<div itemscope itemtype="http://schema.org/person"><span itemprop="familyName"><span itemprop="name">Adam</span></span></div></td><td><div itemscope itemtype="http://schema.org/person"><span itemprop="givenName"><span itemprop="name">Smith</span></span></div>

我对此的保留似乎是非常直观的。我已经指定例如下一位数据类型为&#39; familyName&#39;,那么为什么我需要继续说这是一个&#39;名称&#39;?似乎那种等级关系已经回到了前面。我反过来尝试过,谷歌不会接受它。事实上,谷歌现在并没有抱怨,但它报告的标记结构似乎有点疯狂,而亚当&#39;和史密斯&#39;这看起来像是两个不相关的名字。

我想要做的事情应该是如此简单和如此基本,然而我却无法让它发挥作用是人们会认为应该这样做。

3 个答案:

答案 0 :(得分:1)

没有http://schema.org/people

没有http://schema.org/person。您可能意味着http://schema.org/Person(Schema.org URI区分大小写)。

PostalAddress没有定义属性familyName。使用微数据时,familyName property只能用于Person个项目。这就是Google为您提供这些错误的原因。

如果您要关联PostalAddressPerson,则必须使用Person的{​​{3}}:Personaddress→{ {1}}。 Schema.org不提供任何其他合适的属性,并且Microdata不提供反向属性的机制。

如果您的HTML不允许某种嵌套结构,您可以使用Microdata的address property


在您的示例标记中,您为一个人创建了多个PostalAddress项。你不应该在同一页面上这样做。

所以代替你的标记(从你的例子中取出第一个Person):

tr

你可能想要使用这样的东西:

<tr>
  <td>
    <div itemprop="familyName" itemscope itemtype="http://schema.org/person">Macdonold</div>
  </td>
  <td>
    <div itemprop="givenName" itemscope itemtype="http://schema.org/person">Carol</div></td>
  <td>
    <span itemprop="addressCountry">Australia</span>
  </td>
  <td>
    <span itemprop="telephone">0439213078</span>
  </td>
</tr>

可以使用<tr itemscope itemtype="http://schema.org/Person"> <td itemprop="familyName">Macdonold</td> <td itemprop="givenName">Carol</td> <td itemprop="address" itemscope itemtype="http://schema.org/PostalAddress"> <span itemprop="addressCountry" itemscope itemtype="http://schema.org/Country"> <span itemprop="name">Australia</span> </span> </td> <td itemprop="telephone">0439213078</td> </tr> 元素上的PostalAddress属性添加itemref的其他属性(可能出现在同一页面的任何位置),例如:

td

答案 1 :(得分:0)

在尝试为person而不是name使用familyName和givenName属性时,我看到了相同的错误消息。我个人的感觉是,它只是谷歌测试工具中的一个小故障,在现实世界中,他们应该能够理解标记就好了。但是为了安全起见,如果您的页面结构允许,您可以尝试以这种方式标记名称:

<div itemscope itemtype="http://schema.org/person">
<span itemprop="name"><span itemprop="familyName">Adam</span>
</td><td><span itemprop="givenName">Smith</span></span></div>

答案 2 :(得分:0)

我认为相反,它认为这是一个谷歌故障,它反映了缺乏发展。换句话说,这似乎很可能是一个非常不成熟的协议,而不是一个有问题的协议。在我的应用程序中,名字和姓氏显示在表格中,这在其上下文中是有意义的。这邀请我开始和结束一个破坏表数据(RD)边界的Div标签,从而创建错误的html,或者在TD元素范围内开始和结束div,一次为第一个名称,再次为第二个名称即使它们是同一个“名字”的一部分。这不可避免地产生了“机器可读”的印象,即有两个“名称”,作者无法传达它们是同一个实体的真相。相反,您告诉Google(或任何其他微数据消费者)您有第一个具有名称的实体,特别是一个名字,以及一个具有名称的第二个实体,特别是一个姓氏。没有办法让微观数据表达这些是同一个实体的感觉;至少不是以表格方式呈现此类数据时。我觉得这是一个令人震惊的基本遗漏,但是,我知道什么。简而言之,对于可预见的未来,微数据和表格数据不能很好地协同发挥。