-
清洗HTML数据
算法思路:
·分析html文本信息
·导入正则:re.l、re.L、re.M、re.S...
·清洗HTML标签:DOCTYPE、CDATA、Script、style
·HTML标签、注释、换行等处理:re.compile
·实现正则清洗HTML数据
import re """ re.I 使匹配对大小写不敏感 re.L 做本地化识别(locale-aware)匹配 re.M 多行匹配,影响^和$ re.S 使.匹配包括换行在内的所有字符 re.U 根据Unicode字符集解析字符。这个标志影响\w,\W,\b,\B re.X 该标签通过给予你更灵活的格式以便你将正则表达式写得更容易 """ # 清洗HTML标签文本 # @param htmlstr HTML字符串 def filter_tags(htmlstr): # 过滤DOCTYPE htmlstr = ' '.join(htmlstr.split()) #去除多余空格 re_doctype = re.compile(r'<!DOCTYPE .*?>',re.S) res = re_doctype.sub('',htmlstr) # 过滤CDATA re_cdata = re.comile('//<!CDATA\[[ >]//\]>',re.I) res = re_cdata.sub('',res) #Script re_script = re.compile('<\s*script[^>]*>[^<]*<\s*/\s*script\s*>',re.I) res = re_script.sub('',res) #style re_style = re.compile('<\s*style[^>]*>[^<]*<\s*/\s*script\s*>',re.I) res = re_style.sub('',res) #去掉style # 处理换行 re_br = re.compile('<br\s*?/?>') res = re_br.sub('',res) # 将br转行为换行 # 处理HTML标签 re_h = re.compile('</?\w+[^>]*>') res = re_h.sub('',res) # 去掉HTML # 剔除超链接 http_link = re.compile(r'(http://.+html)') res = http_link.sub('',res) # HTML注释 re_comment = re.compile('<!--[^>]*-->') res = re_comment.sub('',res) # 处理多余的空格 blank_line = re.compile('\n+') res = blank_line.sub('',res) blank_line_1 = re.compile('\n+') res = blank_line_1.sub('',res) blank-line_kon = re.compile('\t') res = blank_line_kon.sub('',res) blank_line_one = re.compile('\r\n') res = blank_line_one.sub('',res) blank_two = re.compile('\t') res = blank_two.sub('',res) blank_three = re.compile('\t') res = blank_three.sub('',res) return def readFile(path): str_doc = "" with open(path,'r',encoding='utf-8') as f: str_doc = f.read() return str_doc if __name__=='__main__': str_doc=readFile(r'./htmldome.txt') res = filter_tags(str_doc) print(res)
查看全部 -
import re # 正则对字符串的清洗 def textParse(str_doc): # 正则过滤掉特殊符号、标点、英文、数字等 r1 = '[a-zA-Z0-9'!"#$%&'()*+,-./::;;|<=>?@.-。?☆、]^_`{|}~]+' # 去除空格 r2 = '\s+' str_doc = re.sub(r1,' ',str_doc) str_doc = re.sub(r2,' ',str_doc) # 去除换行符 str_doc = str_doc.replace('n','') return str_doc def readFile(path): str_doc="" with open(path,'r',encoding='utf-8')as f: str_doc = f.read() return str_doc if __name__=='__main__': # 1.读取文本 path = r'../dataSet/CSCMNews/体育/0.txt' str_doc = readFile(path) # print(str_doc) # 2.数据清洗 mystr=textParse(str_doc) print(mystr)
以上是课堂代码
查看全部 -
高效读取30万新闻
算法思路:
·构建生成器类算法
·构建迭代器类算法
·高效读取30万新闻
·读取30万新闻算法性能对比
import os,time
# 迭代器类
class loadFolders(object):
def __init__(self,par_path):
self.par_path = par_path
def __iter__(self):
for file in os.listdir(self.par_path):
file_abspath = os.path.join(self.par_path,file)
if os.path.isdir(file_abspath):
yield file_abspath #return
class loadFiles(object):
def __init__(self,par_path):
self.par_path = par_path
def __iter__(self):
folders = loadFolders(self.par_path)
for folder in folders:
catg = folder.split(os.sep)[-1]
for file in os.listdir(folder):
yield catg,file
if __name__=='__main__':
filepath = os.path.abspath(r'../dataSet/CSCMNews/')
files = loadFiles(filepath)
for i,msg in enumerate(files):
if i%10000==0:
print('{t}***{i} \t docs has been read'.format(i=i,t=time.strftime('%Y-%m-%d %H:%M:%S',time,localtime())))
end = time.time()
print('Total spent times:%.2f' % (end - start))
生成器小结:
·数组、链表、字符串、文件等缺点就是所有的数据都在内存里,海量的数据耗内存。
·生成器是可以迭代的,工作原理就是重复调用next()方法,直到捕获一个异常。
·有yield的函数不再是一个普通的函数,而是一个生成器generator,可用于迭代。
·yield是一个类似return的关键字。
查看全部 -
递归读取30万新闻
算法思路:
·实现文件遍历递归算法回顾
·遍历读取30万新闻
·每万条读取打印一次屏幕
·完成30万新闻遍历读取
import os,time """ 功能描述:遍历目录,对子文件单独处理 """ # 2 遍历目录文件 def TraversalDir(rootDir): #返回指定目录包含的文件或文件夹的名字的列表 for i,list in enumerate(os.listdir(rootDir)): # 待处理文件夹名字列表 path = os.path.join(rootDir,lists) # 核心算法,对文件具体操作 if os.path.isfile(path): if i%10000 == 0: print('{t}***{i} \t {f} docs has been read'.format(i=i,t=time. strftime('%Y-%m-%d %H:%M:%S',time.localtime()))) # 递归遍历文件目录 if os.path.isdir(path): TraversalDir(path) if __name__=='__main__': t1=time.time() rootDir = r' /dataSet/CSC' TraversalDir(rootDir) t2 = time.time() print('Total Cost Time %.2f' %(t2-t1)+'s')
查看全部 -
yield生成器
算法思路:
·斐波那契数列介绍和数学描述
斐波那契数列:从数列的第三项开始,后面每一项是前面两项之和
数学上的定义:F(0)=1,F(1)=1,...。F(n)=F(n-1)(n>=2,nn∈N﹢)
·斐波那契数列算法实现
·斐波那契数列算法生成器实现
·算法时间性能对比分析
查看全部 -
笔记
查看全部 -
%%writefile aa.py # jupyter notebook中某个cell保存到路径中
%load aa.py #jupyter notebook中加载某个py文件内容
from aa import * 从aa.py中导入所有函数
__name__ =='__main__':这个下面的代码不在调用中执行,只在当前代码中执行
查看全部 -
#设计matplotlib全局字体
import matplotlib
matplotlib.rc("font",family='SimHei')
#局部设置改变字体
font1 = FontProperties(fname=r"c:\windows\fonts\simsun.ttc")
font2 = FontProperties(fname=r"c:\windows\fonts\STHUPO.TTF")
font3 = FontProperties(fname=r"c:\windows\fonts\STCAIYUN.TTF")
plt.xlabel("横轴/单位",fontproperties=font1)
plt.ylabel("纵轴/单位",fontproperties=font1)
plt.title("标题",fontproperties=font3)
查看全部 -
以前在写到读取文件的代码时,经常要用到文件的路径,而每次让我有点搞的糊涂的就是斜杠的用法,又是正斜杠又是反斜杠的,还有双斜杠的,经常要经过几次调试才能正确的把文件的路径弄对,究其原因,主要是每次都没有认真的去总结,总是只要弄出来了就算过了,这样导致每次都会在这个问题上纠结一会,今天终于查了会资料,再加上自己的一些理解,总结一下,以便是我印象更加深刻,也使有需要的同学看到可以根本的解决这个问题。
“\” 这个是反斜杠,也称左斜杠。
“/” 这个是正斜杠,也称右斜杠,斜杠。
在windows中文件的文件的路径是用反斜杠(\)表示(当初是为了和Unix的文件路径使用”/“区分开来),例如 C:\windows\system,但是我们在写程序的时候能不能再路径的字符串中写成C:\windows\system?答案是不能的,这一点想一下就会可以理解,在很多编译器中,“\”是一个转义字符,例如“\n,\r”等,如果在程序中写成“C:\windows\system“那么实际上编译出来的就是“C:windowssystem ",从而获取不到文件,但是这个路径可以写成C:\windows\system,或者也可以用正斜杠C:/windows/system,这两中方式都是可以的。说到这里,基本上这两种用法不会混淆了,只要记住”\“反斜杠有转义的功能,那么写路径的时候就不会出问题了。
顺便拓展一下,文件的相对路径和绝对路径:
例如一个绝对路径:C:\Windows\System\aaa.dll 如果当前目录是C:\windows 那么aaa.dll这个文件的地址可以表示为:
./system/aaa.dll 中”.“表示当前路径, …/windows/system/aaa.dll中”…“表示父级目录。查看全部 -
2.script的清洗
3.style的清洗
查看全部 -
1.re.S
查看全部 -
1.with open这种方式可以自己关闭不用我们自己关
查看全部 -
1.非贪婪模式只匹配一次 s+至少出现一次
查看全部 -
n,a,b =0,0,1 <= 这个和JavaScript里ES6的结构赋值有点像.(好像不叫解构赋值...).
查看全部 -
学到了,python调jar包查看全部
举报