我是python的新手,我想使用正则表达式过滤html标签。我使用了以下功能:
(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');
})();
除了一些js函数之外,大多数标签和代码都可以删除,我遇到了一些问题:
replace
正如你所看到的,有很多这样的功能。所以如何使用正则表达式删除它们?非常感谢。
2 个答案:
答案 0 :(得分:1)
您的正则表达式:<\s*script[^>]*>[^<]*<\s*/\s*script\s*>
不应该包含[^<]*
。您应该保留仅用于匹配标签本身。相反,您应该使用非贪婪的*
,通常在语法上表示为:*?
,因此它看起来像<\s*script[^>]*>.*?<\s*/\s*script\s*>
。你应该在任何地方改变它,包括样式标记和注释正则表达式。
这应该照顾大多数情况。但是,它仍然无法保护您免受'</script>'
中包含字符串的标记的影响,尽管这种情况应该很少见。这种情况很可能很少,如果出现这种情况,你可以手动剥离它。
答案 1 :(得分:0)
我已经通过DataHerder的答案解决了这个问题。当我按照他说的方式更改我的正则表达式时。大部分代码都可以删除,但只有一点js代码没有。所以我看了原始的html代码,并且发现未删除的js代码如下所示:
&lt; SCRIPT LANGUAGE =&#34; JavaScript&#34;&gt;
var cpm_rdm = Math.random();
&LT; / SCRIPT&GT;
&lt;! - 五分之一视窗020903 - &gt;
&lt; SCRIPT type =&#34; text / javascript&#34;&gt;
adInfoTempSc =
{
SRC:&#34; HTTP://img2.126.net/ntesrich/2015/0922/1442887187409_89q7.swf" ;,
网址:&#34; HTTP://g.163.com/a CID = 37873&安培;值= 1760993544&安培;重定向= 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 __&安培;○= HTTP://cars.fxauto.com.cn/ S500 / 003 /&#34 ;,
项:&#34; 8531446021442887975191892&#34;
}
如果(cpm_rdm&GT; 0.6&安培;&安培; cpm_rdm&LT; 0.8){
document.write(&#39;&lt; scr&#39; +&#39; ipt type =&#34; text / javascript&#34; src =&#34; http://img2.126.net/ntesrich/ 2015/0901 / scbox-2015.09.01.js&#34;&GT;&LT; / SCR&#39; +&#39;&IPT GT;&#39);
}
&LT; / SCRIPT&GT;
我认为代码无法消除的共鸣是大写的,就像这样:&lt; SCRIPT LANGUAGE =&#34; JavaScript&#34;&gt;。所以我在我的正则表达式中加了一点。现在我可以过滤所有的标签和代码。再次。
正则表达式现在:
re_cdata = re.compile(&#39; //&LT;!\&GT [CDATA \ [* // \] \。];&#39;,re.DOTALL)
re_script = re.compile(&#39;&LT; \ S *脚本[^&GT;] *&GT。* LT;?\ S * / \ S *脚本\ S * GT;&#39;,re.DOTALL |如re.I)
re_style = re.compile(&#39;&LT; \ S *式[^&GT;] *&GT。* LT;?\ S * / \ S *风格\ S * GT;&#39;,re.DOTALL |如re.I)
re_br = re.compile(&#39;&LT峰; br \ S * /&gt;有&#39;)
re_h = re.compile(&#39;&LT; /?\ W + * GT;&#39;,re.DOTALL)
re_comment = re.compile(&#39;&LT;! - ?* - &GT;&#39;,re.DOTALL)
re.I用于匹配大写