通过HTMLParser验证Google Optimizer javascript代码
我试图在Zope3页面模板中包含下面的Google网站优化器JavaScript代码。用于A/B测试 但是,模板html解析器(我认为是标准的Python HTMLParser模块)抛出以下错误:通过HTMLParser验证Google Optimizer javascript代码,javascript,python,zope,google-website-optimizer,zpt,Javascript,Python,Zope,Google Website Optimizer,Zpt,我试图在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'+'
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']
raiseptruntimeerror(str(self.\u v\u errors))
-警告:编译失败
-警告:第45行第44列的坏端标记:u“”
PTRuntimeError:[“编译失败”,“错误结束标记:u”,在第45行第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 -->
-1) {var j=c.indexOf(';',i);返回c.substring(i+n)。
长度+1,j
utmx(“url”,“A/B”);
鉴于解析器的弱点,您可以尝试将CDATA中它试图解释为标记的部分分解,例如,您现在有“
try”
等(+
在JS中进行字符串链接,就像在Python中一样,因此它将重新组合以这种方式分解的标记,就像在原始文档中已经分解的标记一样)
如果这一直导致解析错误,丢失CDATA并将每个
改为
——不确定JS是否能处理,但值得一试……祝你好运!鉴于解析器的弱点,你可以尝试将CDATA中试图解释为标记的部分分解,例如,你现在的位置让'
尝试'
等(+
在JS中进行字符串链接,就像在Python中一样,因此它将以这种方式重新组合分解的标记,就像在原始代码中已经分解的标记一样)
如果这一直导致解析错误,则丢失CDATA并将每个
更改为
——不确定JS是否能够处理,但值得一试……祝你好运!我猜解析器不喜欢这样的事实
</sc'+'ript>
被一分为二。这是非常有效的javascript,但可能会混淆HTMLPasser
我想试试
<'+'/sc'+'ript>'
'
我猜解析器不喜欢这样的事实
</sc'+'ript>
被一分为二。这是非常有效的javascript,但可能会混淆HTMLPasser
我想试试
<'+'/sc'+'ript>'
'
另一种方法是将代码放在外部文件中并引用它,而不是直接将其嵌入到代码中。我已经这样做了,而且效果很好。如果您不希望验证器抓取任何javascript或css,那么这总是一种更简单的方法。另一种方法是将代码放在外部文件中并重新编译引用它,而不是直接将其嵌入代码中。我已经这样做了,而且效果很好。如果您不希望验证程序对任何javascript或css进行爬网,那么这总是一种更简单的方法。事实上,通过避免使用HTML解析器来解决这个问题很简单。只需将google控件脚本作为一个单独的文件或对象放入一个单独的文件或对象中即可Javascript并使用TAL include将其拉入页面
当文件作为Javascript引入时,不使用HTML解析器。实际上,通过避免使用HTML解析器来解决这个问题并不重要。只需将google控件脚本作为Javascript放入单独的文件或对象中,并使用TAL include将其拉入页面即可
当文件作为Javascript引入时,HTML解析器不使用。与Alex的答案一样有效-但他添加了一点细节;)与Alex的答案一样有效-但他添加了一点细节;)查看我的操作,我尝试了这个,它“破坏了优化器功能”。查看我的操作,我尝试了这个,它“破坏了优化器功能”。