-
清洗HTML數(shù)據(jù)
算法思路:
·分析html文本信息
·導(dǎo)入正則:re.l、re.L、re.M、re.S...
·清洗HTML標(biāo)簽:DOCTYPE、CDATA、Script、style
·HTML標(biāo)簽、注釋、換行等處理:re.compile
·實(shí)現(xiàn)正則清洗HTML數(shù)據(jù)
import?re """ re.I????使匹配對大小寫不敏感 re.L????做本地化識別(locale-aware)匹配 re.M????多行匹配,影響^和$ re.S????使.匹配包括換行在內(nèi)的所有字符 re.U????根據(jù)Unicode字符集解析字符。這個標(biāo)志影響\w,\W,\b,\B re.X????該標(biāo)簽通過給予你更靈活的格式以便你將正則表達(dá)式寫得更容易 """ #?清洗HTML標(biāo)簽文本 #?@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轉(zhuǎn)行為換行 ???? ????#?處理HTML標(biāo)簽 ????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): ????#?正則過濾掉特殊符號、標(biāo)點(diǎn)、英文、數(shù)字等 ????????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.數(shù)據(jù)清洗 ????mystr=textParse(str_doc) ????print(mystr)
以上是課堂代碼
查看全部 -
高效讀取30萬新聞
算法思路:
·構(gòu)建生成器類算法
·構(gòu)建迭代器類算法
·高效讀取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))
?生成器小結(jié):
·數(shù)組、鏈表、字符串、文件等缺點(diǎn)就是所有的數(shù)據(jù)都在內(nèi)存里,海量的數(shù)據(jù)耗內(nèi)存。
·生成器是可以迭代的,工作原理就是重復(fù)調(diào)用next()方法,直到捕獲一個異常。
·有yield的函數(shù)不再是一個普通的函數(shù),而是一個生成器generator,可用于迭代。
·yield是一個類似return的關(guān)鍵字。
查看全部 -
遞歸讀取30萬新聞
算法思路:
·實(shí)現(xiàn)文件遍歷遞歸算法回顧
·遍歷讀取30萬新聞
·每萬條讀取打印一次屏幕
·完成30萬新聞遍歷讀取
import?os,time """ 功能描述:遍歷目錄,對子文件單獨(dú)處理 """ #?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生成器
算法思路:
·斐波那契數(shù)列介紹和數(shù)學(xué)描述
斐波那契數(shù)列:從數(shù)列的第三項(xiàng)開始,后面每一項(xiàng)是前面兩項(xiàng)之和
數(shù)學(xué)上的定義:F(0)=1,F(xiàn)(1)=1,...。F(n)=F(n-1)(n>=2,nn∈N﹢)
·斐波那契數(shù)列算法實(shí)現(xiàn)
·斐波那契數(shù)列算法生成器實(shí)現(xiàn)
·算法時間性能對比分析
查看全部 -
筆記
查看全部 -
%%writefile aa.py? # jupyter notebook中某個cell保存到路徑中
%load aa.py? #jupyter notebook中加載某個py文件內(nèi)容
from aa import * 從aa.py中導(dǎo)入所有函數(shù)
__name__ =='__main__':這個下面的代碼不在調(diào)用中執(zhí)行,只在當(dāng)前代碼中執(zhí)行
查看全部 -
#設(shè)計(jì)matplotlib全局字體
import matplotlib
matplotlib.rc("font",family='SimHei')
#局部設(shè)置改變字體
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("標(biāo)題",fontproperties=font3)
查看全部 -
以前在寫到讀取文件的代碼時,經(jīng)常要用到文件的路徑,而每次讓我有點(diǎn)搞的糊涂的就是斜杠的用法,又是正斜杠又是反斜杠的,還有雙斜杠的,經(jīng)常要經(jīng)過幾次調(diào)試才能正確的把文件的路徑弄對,究其原因,主要是每次都沒有認(rèn)真的去總結(jié),總是只要弄出來了就算過了,這樣導(dǎo)致每次都會在這個問題上糾結(jié)一會,今天終于查了會資料,再加上自己的一些理解,總結(jié)一下,以便是我印象更加深刻,也使有需要的同學(xué)看到可以根本的解決這個問題。
“\” 這個是反斜杠,也稱左斜杠。
“/” 這個是正斜杠,也稱右斜杠,斜杠。
在windows中文件的文件的路徑是用反斜杠(\)表示(當(dāng)初是為了和Unix的文件路徑使用”/“區(qū)分開來),例如 C:\windows\system,但是我們在寫程序的時候能不能再路徑的字符串中寫成C:\windows\system?答案是不能的,這一點(diǎn)想一下就會可以理解,在很多編譯器中,“\”是一個轉(zhuǎn)義字符,例如“\n,\r”等,如果在程序中寫成“C:\windows\system“那么實(shí)際上編譯出來的就是“C:windowssystem ",從而獲取不到文件,但是這個路徑可以寫成C:\windows\system,或者也可以用正斜杠C:/windows/system,這兩中方式都是可以的。說到這里,基本上這兩種用法不會混淆了,只要記住”\“反斜杠有轉(zhuǎn)義的功能,那么寫路徑的時候就不會出問題了。
順便拓展一下,文件的相對路徑和絕對路徑:
例如一個絕對路徑:C:\Windows\System\aaa.dll 如果當(dāng)前目錄是C:\windows 那么aaa.dll這個文件的地址可以表示為:
./system/aaa.dll 中”.“表示當(dāng)前路徑, …/windows/system/aaa.dll中”…“表示父級目錄。查看全部 -
2.script的清洗
3.style的清洗
查看全部 -
1.re.S
查看全部 -
1.with open這種方式可以自己關(guān)閉不用我們自己關(guān)
查看全部 -
1.非貪婪模式只匹配一次 s+至少出現(xiàn)一次?
查看全部 -
n,a,b =0,0,1 <= 這個和JavaScript里ES6的結(jié)構(gòu)賦值有點(diǎn)像.(好像不叫解構(gòu)賦值...).
查看全部 -
學(xué)到了,python調(diào)jar包查看全部
舉報