1

这对于 Javascript 专家来说应该很容易。

对于那些不知道什么是架构 ( http://schema.org ) 的人来说,这是搜索引擎读取网页内容的一种新方式。它通过使用特定标签标记相关数据来工作。

对于那些知道它是什么的人,这里有一个 chrome 扩展(模式资源管理器),它可以很容易地检查你的数据在页面上的样子。请参阅示例。

现在:扩展存在一个小问题,其中 by is 不会跳过/忽略空的嵌套元素。这里有两个例子:第一个完美运行,但第二个炸弹因为空<div>标签:

第一个示例有效:

<div itemscope="" itemtype="http://schema.org/Movie">
   <h1 itemprop="name">Avatar</h1>
   <div itemprop="director" itemscope="" itemtype="http://schema.org/Person">
      Director: <span itemprop="name">James Cameron</span> (born <span itemprop="birthDate">August 16, 1954</span>)
   </div>
   <span itemprop="genre">Science fiction</span>
   <a href="http://pierreloicdoulcet.fr/movies/avatar-theatrical-trailer.html" itemprop="trailer">Trailer</a>
</div>

秒示例给出了问题:

<div itemscope="" itemtype="http://schema.org/Movie">
   <div>
     <h1 itemprop="name">Avatar</h1>
     <div itemprop="director" itemscope="" itemtype="http://schema.org/Person">
         Director: <span itemprop="name">James Cameron</span> (born <span itemprop="birthDate">August 16, 1954</span>)
     </div>
     <span itemprop="genre">Science fiction</span>
     <a href="http://pierreloicdoulcet.fr/movies/avatar-theatrical-trailer.html" itemprop="trailer">Trailer</a>
   </div>
</div>

我查看了扩展程序,实际上它与一个完成大部分工作的 javascript 文件很好地组合在一起。这是执行循环的代码,但是它需要能够跳过空的嵌套元素,并且通常可能更健壮一点

    var __explore = function(node, parentData)
    {
        if (parentData === null || parentData === undefined)
        {
            parentData = __dataTree;
        }
        if (node.getAttribute)
        {
            var isItemScope = node.getAttribute('itemscope');
            var hasItemProp = node.getAttribute('itemprop');
            var itemtype = node.getAttribute('itemtype');


            var childs = node.childNodes;

            var i = 0;

            var tmp = new Array();

            while (i < childs.length)
            {
                if (isItemScope !== null)
                    __explore(childs[i], tmp);
                else
                    __explore(childs[i], null);
                ++i;
            }

            if (isItemScope !== null)
            {
                parentData.push({name : 'scope', value : hasItemProp, type : itemtype, childs : [tmp], node : node});
            }
            else if (hasItemProp && parentData)
            {
                parentData.push({name : hasItemProp, value :  node.innerText});
            }
        }
    }

这是contentscript.js https://gist.github.com/3413475的完整版本

希望有人可以帮助我。作为记录,我已经联系了作者,但他一直忙于更紧急的事情。

4

1 回答 1

1

我让它按预期工作:http: //jsfiddle.net/vyrvp/1/但我必须承认这有点骇人听闻。此代码可能需要更多重构以使其适用于所有情况并使其可读。

于 2012-08-21T08:58:35.180 回答