-
清洗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'!"#$%&'()*+,-./::;;|<=>[email protected]。?☆、]^_`{|}~]+' ????????#?去除空格 ????????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包查看全部
舉報