我们的网站上有一个奇怪的问题,有Facebook评论。看起来facebook刮刀正在错误地解析(至少其中一个)我们的网页,因此它没有在管理员上调整来缓和评论。
如果你去这个链接:
http://www.beliefnet.com/Espanol/10-Atletas-olimpicos-mas-inspiradores.aspx
并查看来源,您会看到我们在头部有适当的标签,包括一个用于fb:admins的标签。如果我在该帐户登录Facebook,我没有主持人选项。
通过facebook对象调试器运行页面,我收到错误,我们在正文中有meta标签。具体来说,这个错误:
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.
查看该页面底部的已删除网址,我看到facebook已经“重新组织”了我们的html,并将元标记从头部放入正文。
有谁知道造成这种情况的原因是什么?我想也许我们在页面的某个地方放了一些格式错误的html,但是我浏览了那个页面的html,看起来不错。还有其他我在这里缺少的东西吗?
答案 0 :(得分:1)
通过validator.w3.org运行您的网址会显示一些警示标志:
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()行时可能会窒息。这些线具有&lt; a&gt;的事实。元素跨越两个document.writes()可能会混淆解析器。并且解析器可能认为它已经到达&lt; body&gt;页面,因此'正文中的元标记'错误。
作为快速测试,请尝试将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()行。
如果以上任何结果都在进行中,请告诉我,我会相应地编辑此答案。
答案 1 :(得分:1)
所以问题最终是在头部嵌套<noscript>...</noscript>
,尝试在没有启用JavaScript的情况下为浏览器添加跟踪像素,这是我们使用的广告服务的一部分。
问题应该是显而易见的,看看facebook给我们的输出'他们如何看到你的页面'。主体在脚本之后立即开始,但是在标签开始之前。显然,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>
....
所以将来,无效的头元素肯定会导致这个问题。