문제

아래에 ZOPE3 페이지 템플릿에 Google 웹 사이트 최적화 JavaScript 코드를 포함 시키려고합니다. A/B 테스트에 사용됩니다.

그러나 표준 파이썬 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']

알 수 있듯이 두 가지 옵션이 있습니다.

  • 코드를 다시 작성하여 통과합니다 (JS-Foo는 약하고 어디서부터 시작 해야할지 모르겠습니다).

  • htmlparser가 코드를 무시하게하십시오. 성공하지 못한 CDATA 태그를 시도했습니다. 또한 JS를 외부 파일에 넣고 연결하려고 시도했지만 보인다 Optimizer 기능을 중단합니다.

용의자 코드 :

<!-- 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에서 문자열 catenation을 수행하므로 이미 원본에서 분해 된 태그와 마찬가지로 이런 방식으로 헤어집니다).

구문 분석 오류가 계속 발생하면 CDATA를 잃고 매번 변경하십시오. < ~ 안으로 &lt;, 모든 > ~ 안으로 &gt; - JS가 그것을 처리 할 것인지 확실하지 않지만 시도해 볼 가치가 있습니다 ... 행운을 빕니다!

다른 팁

실제로,이 문제는 HTML 파서를 모두 피함으로써 해결해야 할 일입니다. Google 컨트롤 스크립트를 별도의 파일 또는 객체에 JavaScript로 넣고 Tal 포함을 사용하여 페이지로 가져 가기 만하면됩니다.

파일을 JavaScript로 가져 오면 HTML 파서가 사용되지 않습니다.

내 생각에 파서는 사실을 좋아하지 않는다.

</sc'+'ript> 

두 개로 나뉩니다. 완벽하게 유효한 JavaScript이지만 HTMLPARSER를 혼동 할 수 있습니까?

시도하고 싶을 수도 있습니다

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

다른 옵션 중 하나는 코드를 외부 파일에 배치하고 코드에 직접 포함시키는 대신 참조하는 것입니다. 나는 이것을 해냈고 그것은 잘 작동합니다. 유효성 검사기가 JavaScript 또는 CSS를 크롤링하지 않으려면 항상 쉬운 방법입니다.

라이센스 : CC-BY-SA ~와 함께 속성
제휴하지 않습니다 StackOverflow
scroll top