通过HTMLParser验证Google Optimizer的JavaScript代码

1 投票
4 回答
762 浏览
提问于 2025-04-15 14:44

我正在尝试在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']

我觉得我有两个选择:

  • 重写代码,让它通过(我的JavaScript水平不高,不知道从哪里开始)。

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

可疑的代码:

<!-- 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 个回答

0

我猜测解析器不喜欢这个原因:

</sc'+'ript> 

被分成了两部分。虽然这在JavaScript中是完全有效的,但可能会让HTML解析器感到困惑。

你可以试试:

<'+'/sc'+'ript>'
1

其实,这个问题很简单,可以通过不使用HTML解析器来解决。简单来说,就是把谷歌控制脚本放到一个单独的文件里,或者放到一个对象中,作为JavaScript来使用,然后通过TAL包含的方式把它引入到页面中。

当这个文件作为JavaScript引入时,就不会使用HTML解析器了。

1

由于解析器的弱点,你可以尝试把CDATA中的部分内容拆开,这样它就不会把这些内容当成标签来解析。例如,现在你有 </sc'+'ript>',可以试试 <'+'/sc'+'ript>' 这种写法。这里的 + 是用来连接字符串的,跟Python里一样,所以这样拆开的标签最后会被拼接回去,就像原本就已经拆开的标签一样。

如果这样还是出现解析错误,那就去掉CDATA,把每个 < 替换成 &lt;,每个 > 替换成 &gt;。虽然不确定JavaScript能否处理这种方式,但试试看也是值得的……祝你好运!

撰写回答