用于过滤JS代码的python regex

regex in python for filter JS code

本文关键字:python regex 代码 过滤 JS 用于      更新时间:2023-09-26

我是新的python,我想通过使用regex过滤html标签。我使用的函数如下:

  def filter_tags(htmlstr):
        re_cdata=re.compile('//<!'[CDATA'[.*//']']>',re.DOTALL)
        re_script=re.compile('<'s*script[^>]*>[^<]*<'s*/'s*script's*>',re.DOTALL)#Script
        re_style=re.compile('<'s*style[^>]*>[^<]*<'s*/'s*style's*>',re.I)#style
        re_br=re.compile('<br's*?/?>')
        re_h=re.compile('</?'w+[^>]*>')
        re_function = re.compile('')
        re_comment=re.compile('<!--[^>]*-->')
        s=re_cdata.sub('',htmlstr)
        s=re_script.sub('',s) 
        s=re_style.sub('',s)
        s=re_br.sub('',s)
        s=re_h.sub('',s) 
        s=re_comment.sub('',s)
        s = re.sub('''t','',s)
        s = re.sub(' ','',s)
        return s

大多数标签和代码可以被删除,除了一些js函数,我遇到了一些麻烦,像这样:

(function(){
NTES.ajax.importJs('http://news.163.com/special/hot_tags_recommend_data/',function(){
varname1,name2,len1,len2,width1,width2,left2;
varloveData=['拎婚房待嫁北京爷们','请网友鉴定是否美女'];
if(hotTagsData.count&&hotTagsData.count>0){
varcode='#from=article',
html=[],
item={name:'',url:''};
for(vari=0;i<hotTagsData.data.length&&i<4;i++){
item=hotTagsData.data[i];
html.push(''+item.name+'');
if(i==1){name1=item.name;}
if(i==2){name2=item.name;}
}
html.push(loveData[0]);
html.push(loveData[1]);
NTES('#js-extraTagList').innerHTML=html.join('');
len1=name1.replace(/[^'x00-'xff]/gi,"aa").length;
len2=name2.replace(/[^'x00-'xff]/gi,"aa").length;
width1=Math.floor((len1/(len1+len2))*271);
width2=271-width1;
left2=96+width1+19;
NTES('.extra-tag-1').addCss('width:'+width1+'px');
NTES('.extra-tag-2').addCss('width:'+width2+'px;left:'+left2+'px;');
}
},'gbk');
})();
如您所见,有许多这样的函数。那么我如何通过使用正则表达式来删除这些呢?非常感谢。

你的正则表达式:<'s*script[^>]*>[^<]*<'s*/'s*script's*>不应该有[^<]*。您应该保留它仅用于匹配标记本身。相反,您应该使用非贪婪的*,通常在语法上表示为:*?,因此它看起来像<'s*script[^>]*>.*?<'s*/'s*script's*>。你应该在任何地方修改它,包括样式标签和注释regex。

这应该可以处理大多数情况。但是,它仍然不能保护您免受标签中有'</script>'字符串的影响,尽管这应该是罕见的。这种情况很可能很少发生,如果出现这种情况,您可以手动删除它。

我已经通过DataHerder的答案解决了这个问题。当我按照他说的方式改变正则表达式时。大部分代码可以删除,但只有一小部分js代码不能删除。所以我看了原始的html代码,发现没有删除的js代码看起来像这样:

<SCRIPT LANGUAGE="JavaScript">
var cpm_rdm=Math.random();
</SCRIPT>
<!--五分之一视窗 020903-->
<SCRIPT type="text/javascript">
adInfoTempSc = 
{
    src:"http://img2.126.net/ntesrich/2015/0922/1442887187409_89q7.swf",
    url:"http://g.163.com/a?CID=37873&Values=1760993544&Redirect=http://e.cn.miaozhen.com/r/k=2012070&p=6we7m&ro=sm&dx=0&rt=2&ns=__IP__&ni=__IESID__&v=__LOC__&nd=__DRA__&np=__POS__&nn=__APP__&o=http://cars.fxauto.com.cn/s500/003/",
    key:"8531446021442887975191892"
}
if(cpm_rdm>0.6&&cpm_rdm<0.8){
document.write('<scr'+'ipt type="text/javascript" src="http://img2.126.net/ntesrich/2015/0901/scbox-2015.09.01.js"></scr'+'ipt>');
}
</SCRIPT>

我认为代码不能删除的原因是这是用大写字母写的,就像这样:<SCRIPT LANGUAGE="JavaScript">。所以我在正则表达式中加了一点。现在我可以过滤所有的标签和代码。再次感谢。现在的正则表达式:

re_cdata=re.compile('//<!'[CDATA'[.*//']']>',re.DOTALL) 
re_script=re.compile('<'s*script[^>]*>.*?<'s*/'s*script's*>',re.DOTALL|re.I)
re_style=re.compile('<'s*style[^>]*>.*?<'s*/'s*style's*>',re.DOTALL|re.I)
re_br=re.compile('<br's*?/?>')
re_h=re.compile('</?'w+.*?>',re.DOTALL)
re_comment=re.compile('<!--.*?-->',re.DOTALL)

re.I用于匹配大写