python 解析html之BeautifulSoup


Posted in Python onJuly 07, 2009
# 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"; 
        tag2 = Tag(self.soup,"script"); 
        tag2['type'] = "text/javascript"; 
        tag2['src'] =self.js_path+"init.js"; 
        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 "<span sty=\"data\" id=\"rep_"+str(rep_id)+"\">"+rep_str+"</span>"; 
    #取得替换数组 
    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 <input-file> <output-file>" % 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();
Python 相关文章推荐
python监控网站运行异常并发送邮件的方法
Mar 13 Python
简单了解Python下用于监视文件系统的pyinotify包
Nov 13 Python
Python正则表达式如何进行字符串替换实例
Dec 28 Python
Python3一行代码实现图片文字识别的示例
Jan 15 Python
详解python while 函数及while和for的区别
Sep 07 Python
python 哈希表实现简单python字典代码实例
Sep 27 Python
python区分不同数据类型的方法
Oct 14 Python
TFRecord文件查看包含的所有Features代码
Feb 17 Python
python绘制动态曲线教程
Feb 24 Python
matlab中imadjust函数的作用及应用举例
Feb 27 Python
python中前缀运算符 *和 **的用法示例详解
May 28 Python
python3的pip路径在哪
Jun 23 Python
打印出python 当前全局变量和入口参数的所有属性
Jul 01 #Python
python 查找文件夹下所有文件 实现代码
Jul 01 #Python
python 运算符 供重载参考
Jun 11 #Python
python getopt 参数处理小示例
Jun 09 #Python
用python分割TXT文件成4K的TXT文件
May 23 #Python
python 正则式 概述及常用字符
May 07 #Python
python 正则式使用心得
May 07 #Python
You might like
PHP在XP下IIS和Apache2服务器上的安装
2006/09/05 PHP
其他功能
2006/10/09 PHP
JavaScript高级程序设计 错误处理与调试学习笔记
2011/09/10 Javascript
深入理解JavaScript是如何实现继承的
2013/12/12 Javascript
js不能获取隐藏的div的宽度只能先显示后获取
2014/09/04 Javascript
jQuery on方法传递参数示例
2014/12/09 Javascript
js判断子窗体是否关闭的方法
2015/08/11 Javascript
通过点击jqgrid表格弹出需要的表格数据
2015/12/02 Javascript
React组件对子组件children进行加强的方法
2019/06/23 Javascript
如何换个角度使用VUE过滤器详解
2019/09/11 Javascript
Element Tooltip 文字提示的使用示例
2020/07/26 Javascript
vue cli 3.0通用打包配置代码,不分一二级目录
2020/09/02 Javascript
[42:22]DOTA2上海特级锦标赛C组小组赛#1 OG VS Archon第一局
2016/02/27 DOTA
Python实现的Excel文件读写类
2015/07/30 Python
Python中functools模块的常用函数解析
2016/06/30 Python
linux平台使用Python制作BT种子并获取BT种子信息的方法
2017/01/20 Python
Python3 加密(hashlib和hmac)模块的实现
2017/11/23 Python
python3.4+pycharm 环境安装及使用方法
2019/06/13 Python
Django--权限Permissions的例子
2019/08/28 Python
python openvc 裁剪、剪切图片 提取图片的行和列
2019/09/19 Python
python实现while循环打印星星的四种形状
2019/11/23 Python
使用Python进行防病毒免杀解析
2019/12/13 Python
Django media static外部访问Django中的图片设置教程
2020/04/07 Python
python mongo 向数据中的数组类型新增数据操作
2020/12/05 Python
家乐福巴西网上超市:Carrefour巴西
2016/10/31 全球购物
吉力贝官方网站:Jelly Belly
2019/03/11 全球购物
军用级手机壳,专为冒险而建:Zizo Wireless
2019/08/07 全球购物
Java里面如何把一个Array数组转换成Collection, List
2013/07/26 面试题
SQL面试题
2013/04/30 面试题
经济管理专业自荐信
2013/12/30 职场文书
宿舍违规检讨书
2014/01/12 职场文书
运动会100米解说词
2014/01/23 职场文书
网上蛋糕店创业计划书
2014/01/24 职场文书
土木工程专业推荐信
2014/02/19 职场文书
《歌唱二小放牛郎》教学反思
2014/04/19 职场文书
员工工作心得体会
2019/05/07 职场文书