0

我们的网站上出现了一个奇怪的问题,其中包含 facebook 评论。看起来 facebook 抓取工具错误地解析了(至少一个)我们的网页,因此它不会让管理员来审核评论。

如果你去这个链接:

http://www.beliefnet.com/Espanol/10-Atletas-olimpicos-mas-inspiradores.aspx

并查看源代码,您会看到我们在头部有适当的标签,包括一个用于 fb:admins 的标签。如果我使用该帐户登录 facebook,我将没有版主选项。

通过 facebook 对象调试器运行页面,我收到一个错误,我们在正文中有元标记。具体来说,这个错误:

Meta Tags In Body:  You have tags ouside of your . This is either because 
your was malformed and they fell lower in the parse tree, or you accidentally
put your Open Graph tags in the wrong place. Either way you need to fix it 
before the tags are usable.

查看该页面底部的抓取 URL,我看到 Facebook 已经“重新组织”了我们的 html,并将元标记从头部放置到了正文中。

有谁知道是什么原因造成的?我想也许我们在页面的某个地方有一些格式不正确的 html,导致一切都失败了,但我浏览了那个页面的 html,它看起来不错。我在这里还缺少其他东西吗?

4

2 回答 2

1

通过 validator.w3.org 运行您的 URL 会显示一些警告信号:

Line 77, Column 14: document type does not allow element "noscript" here; assuming missing "object" start-tag
Line 154, Column 699: document type does not allow element "meta" here

我能够将(潜在的)问题缩小到您页面中的这些行:

document.write('<a href="' + OAS.config.url + 'click_nx.ads/' + OAS.config.sitepage + '/1' + OAS.config.rns + '@' + OAS.config.listpos + '!' + pos + '?' + OAS.config.query + '" target=' + OAS.config.target + '>');
document.write('<img src="' + OAS.config.url + 'adstream_nx.ads/' + OAS.config.sitepage + '/1' + OAS.config.rns + '@' + OAS.config.listpos + '!' + pos + '?' + OAS.config.query + '" border=\"0\" /></a>');

这些 document.write() 行也未能通过 w3.org 验证器:

Line 53, Column 197: character "+" is not allowed in the value of attribute "target"

此外,我认为使用 document.write() 插入 DOM 是不好的(因为它会导致页面渲染阻塞)。你能改成使用 js 对象和 DOM 操作吗?

在 FB 获取您的 URL 后,它会通过一个 DOM 解析器运行它,当它遇到那些 document.write() 行时可能会窒息。这些行有一个跨越两个 document.writes() 的 <a> 元素这一事实可能会使解析器感到困惑。解析器可能认为它已到达页面的 <body>,因此出现“正文中的元标记”错误。

作为一个快速测试,尝试将 fb:admins 元标记放在这些 document.write() 行之上。虽然,如果解析器仍然阻塞,我不会感到惊讶,但值得一试。

为了测试您页面的 html 源代码,我使用了此 php.net 页面末尾的评论中提供的简单脚本: http ://www.php.net/manual/en/class.domxpath.php

它产生了错误:

Unexpected end tag : a in /home/dlee/tmp/tmp.html, line: 54
Unexpected end tag : head in /home/dlee/tmp/tmp.html, line: 183
htmlParseStartTag: misplaced <body> tag in /home/dlee/tmp/tmp.html, line: 184

其中 tmp.html 是保存到文件的页面的 html。第 54 行是前面提到的 document.write() 行。

如果上述任何结果正在进行中,请告诉我,我将相应地编辑此答案。

于 2012-08-07T22:36:31.550 回答
1

所以问题最终是<noscript>...</noscript>头部有一个嵌套,它试图为没有启用 javascript 的浏览器包含一个跟踪像素,作为我们使用的广告服务的一部分。

从 facebook 给我们的“他们如何看待你的页面”的输出来看,这个问题应该很明显。正文在脚本之后立即开始,但在标记开始的位置之前。显然,当 facebook 解析器在头部中看到应该在身体中的元素时,它会吓坏了,所以它立即从那里开始身体。

... 脸书输出 ...

        console.log(OAS);
    })();
</script><!-- End OAS Setup --><!-- Begin comScore Tag --><script>
      var _comscore = _comscore || [];
      _comscore.push({ c1: "2", c2: "8428430" });
      (function() {
        var s = document.createElement("script"), el = document.getElementsByTagName("script")[0]; s.async = true;
        s.src = (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js";
        el.parentNode.insertBefore(s, el);
      })();
    </script>
</head>
<body>
<noscript>

    </noscript>
    <!-- End comScore Tag -->

...我们的html ...

<head>   
    <meta http-equiv="X-UA-Compatible" content="IE=edge" />

    <asp:PlaceHolder id="OASHeader" runat="server" />

    <!-- Begin comScore Tag -->
    <script type="text/javascript">
      var _comscore = _comscore || [];
      _comscore.push({ c1: "2", c2: "8428430" });
      (function() {
        var s = document.createElement("script"), el = document.getElementsByTagName("script")[0]; s.async = true;
        s.src = (document.location.protocol == "https:" ? "https://sb" : "http://b") + ".scorecardresearch.com/beacon.js";
        el.parentNode.insertBefore(s, el);
      })();
    </script>    
    <!-- End comScore Tag -->
    <noscript>
        <img src="http://b.scorecardresearch.com/p?c1=2&c2=8428430&cv=2.0&cj=1" alt="" />
    </noscript>

    <script type="text/javascript">
    ....
    <body>
    ....

所以在未来,无效的头部元素肯定会导致这个问题。

于 2012-08-08T20:40:20.253 回答