Проверка кода javascript Google Optimizer с помощью HTMLParser

Я пытаюсь включить приведенный ниже код JavaScript оптимизатора веб-сайта Google в шаблон страницы Zope3. Он используется для 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 -->

person Jon Hadley    schedule 01.10.2009    source источник


Ответы (4)


Учитывая слабость синтаксического анализатора, вы можете попробовать разбить части CDATA, которые он пытается интерпретировать как теги, например. где теперь у вас есть </sc'+'ript>' try <'+'/sc'+'ript>' и т. д. (+ выполняет связывание строк в JS, как и в Python, поэтому он снова собирает теги, которые вы разбиваете таким образом, точно так же, как теги, которые уже разбиты в оригинале).

Если это продолжает выдавать ошибки синтаксического анализа, потеряйте CDATA и замените каждый < на &lt;, каждый > на &gt; - не уверен, что JS справится с этим, но попробовать стоит... удачи!

person Alex Martelli    schedule 01.10.2009

На самом деле, эту проблему легко решить, полностью отказавшись от синтаксического анализатора HTML. Просто поместите скрипт управления Google в отдельный файл или объект как Javascript и перетащите его на страницу с включением TAL.

Анализатор HTML не используется, когда файл вводится как Javascript.

person A Cage    schedule 17.02.2011

Я предполагаю, что синтаксическому анализатору не нравится тот факт, что

</sc'+'ript> 

делится надвое. Что является абсолютно правильным javascript, но может запутать htmlparser?

Может попробовать

<'+'/sc'+'ript>'
person Ryu    schedule 01.10.2009
comment
Так же, как и ответ Алекса, но он добавил немного больше деталей;) - person Jon Hadley; 02.10.2009

Еще один вариант, который у вас есть, — поместить код во внешний файл и ссылаться на него вместо того, чтобы встраивать его непосредственно в код. Я сделал это, и это работает хорошо. Это всегда проще, если вы не хотите, чтобы валидатор сканировал какой-либо javascript или css.

person Online Colleges Geek    schedule 27.10.2010
comment
Смотрите мой OP, я попробовал это, и это «сломал функциональность оптимизатора». - person Jon Hadley; 29.10.2010