質問

以下の Google ウェブサイト オプティマイザー JavaScript コードを Zope3 ページ テンプレートに含めようとしています。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']

私が見たところ、選択肢は 2 つあります。

  • 合格するようにコードを書き直します (私の 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 -->
役に立ちましたか?

解決

パーサの弱さを考えると、あなたは例えば、タグとして解釈しようとしているCDATAの部分を解体しようとすることができあなたは今</sc'+'ript>'など(それだけですでに元に分割されたタグと同様に、あなたがこの方法を破る一緒に再びタグを入れますので<'+'/sc'+'ript>'は、単にPythonでのように、JSの文字列カテネーションを行います)してみてください+持っています。

それは解析エラーを与え続けている場合、CDATAを失うと、<&lt;にすべての>すべての&gt;を変更 - JSがそれを処理するかどうかわからないが、それは試してみる価値がある...幸運

他のヒント

実は、この問題は、すべて一緒にHTMLパーサを回避することにより、解決するのは簡単です。単純にJavaScriptなどの個別のファイルまたはオブジェクトにGoogleの制御スクリプトを入れて、含まTALのページにそれを引き出します。

ファイルはJavaScriptとして持ち込まれたときにHTMLパーサが使用されていない。

私の推測では、パーサが事実を好きではないです。

その
</sc'+'ript> 

は、2つに分割されます。これはjavascriptを完全に有効ですが、htmlparserを混乱させる可能性?

タグしようとする場合があります
<'+'/sc'+'ript>'
あなたが持っているもう一つの選択肢は、外部ファイルにコードを配置し、コードに直接埋め込むのではなく、それを参照することです。私はこれをやったし、それがうまく動作します。それは常にあなたがバリデータは、任意のjavascriptやCSSをクロールしたくない場合は、より簡単な方法です。

ライセンス: CC-BY-SA帰属
所属していません StackOverflow
scroll top