700字范文,内容丰富有趣,生活中的好帮手!
700字范文 > python文本筛选html_python 正则表达式过滤文本中的html标签 源代码解析

python文本筛选html_python 正则表达式过滤文本中的html标签 源代码解析

时间:2018-10-18 16:11:20

相关推荐

python文本筛选html_python 正则表达式过滤文本中的html标签 源代码解析

#py2.7

#coding:utf-8

import re

import os

import chardet

def filter_tag(htmlstr):

re_cdata = pile('^>]*>', re.I)

re_script = pile(']*>[^', re.I) #过滤脚本

re_style = pile(']*>[^', re.I) #过滤style

re_br = pile('

')

re_h = pile('?\w+[^>]*>')

re_comment = pile('')

s = re_cdata.sub('', htmlstr)

s = re_script.sub('', s)

s=re_style.sub('',s)

s=re_br.sub('\n',s)

s=re_h.sub(' ',s)

s=re_comment.sub('',s)

blank_line=pile('\n+')

s=blank_line.sub('\n',s)

s=re.sub('\s+',' ',s)

s=replaceCharEntity(s)

return s

def replaceCharEntity(htmlstr):

CHAR_ENTITIES={'nbsp':'','160':'',

'lt':'

'gt':'>','62':'>',

'amp':'&','38':'&',

'quot':'"','34':'"'}

re_charEntity=pile(r'?(?P\w+);') #命名组,把 匹配字段中\w+的部分命名为name,可以用group函数获取

sz=re_charEntity.search(htmlstr)

while sz:

#entity=sz.group()

key=sz.group('name') #命名组的获取

try:

htmlstr=re_charEntity.sub(CHAR_ENTITIES[key],htmlstr,1) #1表示替换第一个匹配

sz=re_charEntity.search(htmlstr)

except KeyError:

htmlstr=re_charEntity.sub('',htmlstr,1)

sz=re_charEntity.search(htmlstr)

return htmlstr

if __name__=='__main__':

cpath=os.getcwd()

for root,dirs,files in os.walk(cpath):

for file in files:

if file.endswith('htm') or file.endswith('html'):

f=open(root+os.path.sep+file)

stream=f.read()

htmlstr =stream.decode(chardet.detect(stream)['encoding'])

rs=filter_tag(htmlstr)

f.close()

txtname=re.sub(r'.htm*$','.txt',file)

print txtname

f=open(root+os.path.sep+txtname,'w')

f.write(rs.encode('utf-8'))

f.close()

总结:

转义符:

. 匹配除换行符以外的任意字符

\w 匹配字母或数字或下划线或汉字

\s 匹配任意的空白符

\d 匹配数字

\b 匹配单词的开始或结束

^ 匹配字符串的开始

$ 匹配字符串的结束

\W 匹配任意不是字母,数字,下划线,汉字的字符

\S 匹配任意不是空白符的字符

\D 匹配任意非数字的字符

\B 匹配不是单词开头或结束的位置

[^x] 匹配除了x以外的任意字符

[^aeiou] 匹配除了aeiou这几个字母以外的任意字符

常用的限定符代码/语法说明:

*重复零次或更多次

+重复一次或更多次

?重复零次或一次

{n}重复n次

{n,}重复n次或更多次

{n,m}重复n到m次

关于命名组:

这篇文章里面还提到了界定( 问号开头,前向则有个'

前向界定(?<=…)

后向界定(?=…)

前向非界定 (?

后向非界定 (?!.....)

本内容不代表本网观点和政治立场,如有侵犯你的权益请联系我们处理。
网友评论
网友评论仅供其表达个人看法,并不表明网站立场。