我正在尝试在Zope3页面模板中添加下面的Google网站优化工具JavaScript代码。它用于A / B测试。
但是,模板html解析器,我认为是标准的Python HTMLParser模块,会引发以下错误:
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 -->
答案 0 :(得分:1)
鉴于解析器的弱点,你可以尝试分解它试图将其解释为标签的CDATA部分,例如:您现在在哪里</sc'+'ript>'
尝试<'+'/sc'+'ript>'
等等(+
在JS中执行字符串连接,就像在Python中一样,因此它会再次将您分解的标记重新组合在一起,就像已经在原文中分解的标签。
如果这会导致解析错误,请丢失CDATA并将每<
更改为<
,每>
更改为>
- 不确定JS是否会处理该问题但值得一试......祝你好运!
答案 1 :(得分:1)
实际上,通过一起避免HTML解析器来解决这个问题是微不足道的。只需将Google控制脚本作为Javascript放入单独的文件或对象中,然后将其拉入包含TAL的页面。
当文件以Javascript格式引入时,不使用HTML解析器。
答案 2 :(得分:0)
我的猜测是解析器不喜欢这个事实
</sc'+'ript>
分为两部分。这是完全有效的JavaScript,但可能会混淆htmlparser?
可能想尝试
<'+'/sc'+'ript>'
答案 3 :(得分:-1)
另一个选择是将代码放在外部文件中并引用它而不是将其直接嵌入到代码中。我做到了这一点,效果很好。如果您不希望验证程序抓取任何javascript或css,那么这总是更简单的方法。