Проверка кода JavaScript оптимизатора Google с помощью HTMLParser
Я пытаюсь включить приведенный ниже код JavaScript Оптимизатора веб-сайта в шаблон страницы Zope3. Используется для А / Б тестирования.
Однако шаблонный анализатор 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 -->
4 ответа
Учитывая слабость синтаксического анализатора, вы можете попытаться разбить части CDATA, которые он пытается интерпретировать как теги, например, где у вас сейчас есть </sc'+'ript>'
пытаться <'+'/sc'+'ript>'
так далее (+
выполняет цепочку строк в JS, как и в Python, поэтому он снова соединит вместе теги, которые вы разбили таким образом, точно так же, как теги, которые уже разбиты в оригинале).
Если это продолжает давать ошибки разбора, потерять CDATA и менять каждый <
в <
каждый >
в >
- не уверен, что JS справится с этим, но стоит попробовать... удачи!
На самом деле эту проблему тривиально решить, избегая всего анализа HTML. Просто поместите скрипт управления Google в отдельный файл или объект в виде Javascript и перетащите его на страницу с включением TAL.
Анализатор HTML не используется, когда файл вводится как Javascript.
Я думаю, парсеру не нравится тот факт, что
</sc'+'ript>
делится на две части. Какой совершенно правильный JavaScript, но может запутать htmlparser?
Могу попробовать
<'+'/sc'+'ript>'
Еще один вариант, который у вас есть, - поместить код во внешний файл и ссылаться на него, а не вставлять его непосредственно в код. Я сделал это, и это работает хорошо. Это всегда более простой способ, если вы не хотите, чтобы валидатор сканировал javascript или css.