python解析html之beautifulsoup

代码如下:

# coding=utf-8 from beautifulsoup import beautifulsoup, tag, navigablestring from sentencespliter import sentencespliter from os.path import basename,dirname,isdir,isfile from os import makedirs from shutil import copyfile import io import time import re class build_tpl: def __init__(self,parse_file,build_tpl_name,cp_pic_dir,show_pic_dir,js_path,set_lang=2052): ”’参数说明:解析文件名,模版名称,保存图片路径,图片显示路径,js路径,当前语言(分句使用)”’ #取得解析文件目录路径 if len(dirname(parse_file))>1: self.cur_dir = dirname(parse_file)+”/”; else: self.cur_dir =”./”; #建立的模版文件文件名 self.build_tpl_name = build_tpl_name; #图片cp到得目录 self.cp_pic_dir = cp_pic_dir; #通过http展现图片的目录 self.show_pic_dir = show_pic_dir; #加载js的路径 self.js_path = js_path; #句段组 self.get_text_arr = []; #当前图片名数组 self.cur_pic_arr = []; #解析文件 取得soup 资源 self.soup = self.get_soup(parse_file); #取得html文档中,段文档 self.get_text_arr = self.soup.body.findall(text=lambda(x): len(x.strip()) > 0); #取得句对 self.get_sentence_arr = self.parse_text(self.get_text_arr,set_lang); #取得替换数组 self.replace_list = self.get_replace_list(self.get_text_arr,set_lang); #取得图片数组 self.cur_pic_arr = self.soup.findall(‘img’); #self.write_file_by_list(“no.txt”,self.get_text_arr); #self.write_file_by_list(“yes.txt”,self.get_sentence_arr); #保存词组到文件 def save_data_file(self): file_name = self.build_tpl_name+”.data”; self.write_file_by_list(file_name,self.get_data()); #取得词组 def get_data(self): return self.get_sentence_arr; #数组写入到文档 def write_file_by_list(self,file_name,write_arr): file=io.fileio(file_name,”w”); file.write((‘\n’.join(write_arr)).encode(‘utf-8’)); file.close(); #字符串写入到文档 def write_file(self,file_name,file_contents): file=io.fileio(file_name,”w”); file.write(file_contents.encode(‘utf-8’)); file.close(); #建立图片hash目录 def get_pic_hash(self): return time.strftime(“%y/%m/%d/”); #建立模版文件 def builder(self): #没能发生替换的单词 bug_msg = []; #进行内容模版替换 for i in range(len(self.get_text_arr)): #替换 rep_str = “$rep_arr[{0}]”.format(i); try: self.soup.body.find(text=self.get_text_arr[i]).replacewith(self.replace_list[i]); except attributeerror: bug_msg.append(self.get_text_arr[i]); #取得图片hash路径 hash_dir = self.get_pic_hash(); #构造展示图片路径 show_pic_dir = self.show_pic_dir+hash_dir; #构造图片保存路径 cp_pic_dir = self.cp_pic_dir+hash_dir; #判断保存图片的目录是否存在 不存在建立 if not isdir(cp_pic_dir): makedirs(cp_pic_dir); for pic_name in self.cur_pic_arr: #进行图片路径替换 old_pic_src = pic_name[‘src’]; pic_name[‘src’] = show_pic_dir+old_pic_src; #进行图片拷贝 cp_src_file = self.cur_dir+old_pic_src; cp_dis_file = cp_pic_dir+old_pic_src; copyfile(cp_src_file,cp_dis_file); #建立bug信息的文档 #self.write_file_by_list(“bug.txt”,bug_msg); #添加js tag = tag(self.soup,”script”); tag[‘type’] = “text/javascript”; tag[‘src’] =self.js_path+”jquery.js?1.1.9″; tag2 = tag(self.soup,”script”); tag2[‘type’] = “text/javascript”; tag2[‘src’] =self.js_path+”init.js?1.1.9″; self.soup.head.insert(2,tag2); self.soup.head.insert(2,tag); #建立模版 self.write_file(self.build_tpl_name,self.soup); #取得替换的html文件 def get_replace_html(self,rep_id,rep_data=””): ”’ 参数说明:替换id,替换内容(为空的采用模版模式替换) ”’ if len(rep_data) > 0 : rep_str = rep_data; else: rep_str = “$rep_arr[{0}]”.format(rep_id); return “”+rep_str+””; #取得替换数组 def get_replace_list(self,text_arr,set_lang): sp = sentencespliter(); sp.setlang(set_lang); temp_sentence = []; jump_i = 0; for text in text_arr: slist = sp.split(text); replace_temp = “”; if slist != none: for item in slist: replace_temp = replace_temp+self.get_replace_html(jump_i,item); jump_i=jump_i+1; else: replace_temp = self.get_replace_html(jump_i,text); jump_i=jump_i+1; temp_sentence.append(replace_temp); return temp_sentence; #分句 def parse_text(self,text_arr,set_lang): sp = sentencespliter(); sp.setlang(set_lang); temp_sentence = []; for text in text_arr: slist = sp.split(text); if slist != none: for item in slist: temp_sentence.append(item); else: temp_sentence.append(text); return temp_sentence; #取得解析资源 def get_soup(self,parse_file): try: file=io.fileio(parse_file,”r”); doc = file.readall(); file.close(); except ioerror: print ‘error: %s file not found!’ %parse_file; return false; #开始解析html文档 return beautifulsoup(”.join(doc)); if __name__ == “__main__”: from sys import argv, exit; if len(argv) < 3: print "usage: python %s " % argv[0] exit(255); if not isfile(argv[1]): print "no such input file: %s" % argv[1] exit(1) paser_file = argv[1];#"html/testpic.html"; tpl_file = argv[2]; save_pic_path = argv[3]; show_pic_path = argv[4]; load_js_path = argv[5]; #解析开始 设置解析文件,模版名,图片保存路径,图片显示路径 so = build_tpl(paser_file,tpl_file,save_pic_path,show_pic_path,load_js_path); #建立模版 so.builder(); #保存分句的句对 so.save_data_file();

Posted in 未分类

发表评论