python中过滤器JS cod的regex

2024-04-19 02:54:26 发布

您现在位置:Python中文网/ 问答频道 /正文

我是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');
})();

如你所见,有很多功能这个。所以呢如何使用regex删除这些?谢谢。你知道吗


Tags: namebrredatastylehtmlscriptfunction
2条回答

我已经用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用于匹配大写字母

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

这应该能解决大多数情况。但是,它仍然不能保护您不受带有'</script>'字符串的标记的影响,尽管这应该很少见。这种情况很可能是远和少数之间,如果这样的情况出现,你可以手动剥离出来。你知道吗

相关问题 更多 >