1

我正在尝试在 Zope3 页面模板中包含下面的 Google 网站优化器 JavaScript 代码。它用于 A/B 测试。

但是,我认为是标准 Python HTMLParser 模块的模板 html 解析器会引发以下错误:

raise PTRuntimeError(str(self._v_errors))
- Warning: Compilation failed
- Warning: <class 'HTMLParser.HTMLParseError'>: bad end tag: u"</sc'+'ript>", at line 45, column 44
PTRuntimeError: ['Compilation failed', '<class \'HTMLParser.HTMLParseError\'>: bad end tag: u"</sc\'+\'ript>", at line 45, column 44']

正如我所看到的,我有两个选择:

  • 重写代码使其通过(我的 JS-foo 很弱,不知道从哪里开始)。

  • 使 HTMLParser 忽略代码。我试过 CDATA 标签,但没有成功。我还尝试将 js 放在外部文件中并链接到它,但这似乎破坏了优化器的功能。

可疑代码:

<!-- Google Website Optimizer Control Script -->
<script>
<![CDATA[
function utmx_section(){}function utmx(){}
(function(){var k='1010538027',d=document,l=d.location,c=d.cookie;function f(n){
if(c){var i=c.indexOf(n+'=');if(i>-1){var j=c.indexOf(';',i);return c.substring(i+n.
length+1,j<0?c.length:j)}}}var x=f('__utmx'),xx=f('__utmxx'),h=l.hash;
d.write('<sc'+'ript src="'+
'http'+(l.protocol=='https:'?'s://ssl':'://www')+'.google-analytics.com'
+'/siteopt.js?v=1&utmxkey='+k+'&utmx='+(x?x:'')+'&utmxx='+(xx?xx:'')+'&utmxtime='
+new Date().valueOf()+(h?'&utmxhash='+escape(h.substr(1)):'')+
'" type="text/javascript" charset="utf-8"></sc'+'ript>')})();
]]>
</script><script>utmx("url",'A/B');</script>
<!-- End of Google Website Optimizer Control Script -->
4

4 回答 4

1

鉴于解析器的弱点,您可以尝试分解它试图解释为标签的 CDATA 部分,例如,您现在有</sc'+'ript>'try<'+'/sc'+'ript>'等(+在 JS 中进行字符串连接,就像在 Python 中一样,所以它会再次组合在一起您以这种方式分解的标签,就像原始标签中已经分解的标签一样)。

如果这不断给出解析错误,请丢失 CDATA 并更改 every <into &lt;, every >into &gt;——不确定 JS 是否会处理这个问题,但值得一试……祝你好运!

于 2009-10-01T21:18:25.733 回答
1

实际上,通过同时避免 HTML 解析器来解决这个问题是微不足道的。只需将 google 控制脚本作为 Javascript 放入单独的文件或对象中,然后使用 TAL 包含将其拉入页面。

当文件作为 Javascript 引入时,不使用 HTML 解析器。

于 2011-02-17T05:43:17.633 回答
0

我的猜测是解析器不喜欢这样的事实

</sc'+'ript> 

分为两部分。哪个是完全有效的 javascript 但可能会混淆 htmlparser?

可能想试试

<'+'/sc'+'ript>'
于 2009-10-01T21:19:37.040 回答
-1

另一种选择是将代码放在外部文件中并引用它,而不是将其直接嵌入到代码中。我已经这样做了,而且效果很好。如果您不希望验证器抓取任何 javascript 或 css,这总是一种更简单的方法。

于 2010-10-27T18:05:26.390 回答