用于过滤JS代码的python regex
regex in python for filter JS code
我是新的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
用于匹配大写
相关文章:
- 从桌面读取python文件时高亮显示代码
- RegEx删除空属性?例如,如果(class=“”||class=“”)移除;否则就下课
- Regex代码只允许一个空格
- Regex匹配除“”之外的所有字符;.js”;
- python-selenium-点击上升链接
- RegExp:匹配Javascript中除regex值之外的所有内容
- Javascript RegEx validator
- 使用regex的jquery keydown绑定不会验证撇号和句点
- python到“;流“;字典处理
- 制作一个regex来验证只有一个数字的字符串
- RegEx JavaScript:数字后的符号提取
- PHP和Javascript之间的Regex差异
- 链接和youtube的Javascript和regex
- 什么's本地node.js服务器和python简单http服务器之间的区别
- 包含圆括号的JavaScript Regex模式
- 使用Python和Regex从URL获取YouTube视频ID
- 我可以使用regex与Python和Selenium一起找到一个元素吗
- 在Python中执行简单Javascript Regex
- 需要帮助Regex for python
- 用于过滤JS代码的python regex