我是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删除这些?谢谢。你知道吗
我已经用DataHerder的方法解决了这个问题回答。什么时候我改变了我的正则表达式说。大多数的代码可以删除,但只有一点js代码不是。所以我查看了原始html代码,发现未删除的js代码如下所示:
我认为代码不能被删除的原因是这是用大写写的,就像这样:
<SCRIPT LANGUAGE="JavaScript">
。所以我在日常生活中加了一点表情。现在我可以过滤所有的标签和代码。谢谢再一次。 正则表达式现在:re.I
用于匹配大写字母正则表达式:
<\s*script[^>]*>[^<]*<\s*/\s*script\s*>
不应具有[^<]*
。你应该保留它只是为了匹配标签本身。相反,您应该使用非贪婪的*
,通常在语法上表示为:*?
,因此它看起来像<\s*script[^>]*>.*?<\s*/\s*script\s*>
。您应该在任何地方更改它,包括样式标记和注释regex。你知道吗这应该能解决大多数情况。但是,它仍然不能保护您不受带有
'</script>'
字符串的标记的影响,尽管这应该很少见。这种情况很可能是远和少数之间,如果这样的情况出现,你可以手动剥离出来。你知道吗相关问题 更多 >
编程相关推荐