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刷投票的脚本实现代码
Nov 08 Python
python中Flask框架简单入门实例
Mar 21 Python
Python字符串处理函数简明总结
Apr 13 Python
bpython 功能强大的Python shell
Feb 16 Python
Python+tkinter使用80行代码实现一个计算器实例
Jan 16 Python
详解将Python程序(.py)转换为Windows可执行文件(.exe)
Jul 19 Python
pytorch numpy list类型之间的相互转换实例
Aug 18 Python
window7下的python2.7版本和python3.5版本的opencv-python安装过程
Oct 24 Python
python实现控制台输出彩色字体
Apr 05 Python
使用pth文件添加Python环境变量方式
May 26 Python
python爬虫用mongodb的理由
Jul 28 Python
Python实现异步IO的示例
Nov 05 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非常实用的功能
2015/09/29 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
Mootools 1.2教程 事件处理
2009/09/15 Javascript
THREE.JS入门教程(5)你应当知道的十件事
2013/01/24 Javascript
使用JavaScript和C#中获得referer
2014/11/14 Javascript
Javascript基础教程之关键字和保留字汇总
2015/01/18 Javascript
个人网站留言页面(前端jQuery编写、后台php读写MySQL)
2016/05/03 Javascript
JS实现的自定义显示加载等待图片插件(loading.gif)
2016/06/17 Javascript
onmouseover事件和onmouseout事件全面理解
2016/08/15 Javascript
解决Linux无法正常安装与卸载Node.js的方法
2018/01/19 Javascript
Java设计中的Builder模式的介绍
2018/03/22 Javascript
如何用webpack4带你实现一个vue的打包的项目
2018/06/20 Javascript
js实现一款简单踩白块小游戏(曾经很火)
2019/12/02 Javascript
JavaScript实现随机点名程序
2020/03/25 Javascript
js里面的变量范围分享
2020/07/18 Javascript
JavaScript前端开发时数值运算的小技巧
2020/07/28 Javascript
python静态方法实例
2015/01/14 Python
python面试题小结附答案实例代码
2019/04/11 Python
Python面向对象程序设计类的多态用法详解
2019/04/12 Python
利用anaconda作为python的依赖库管理方法
2019/08/13 Python
Python 函数list&amp;read&amp;seek详解
2019/08/28 Python
PyTorch中Tensor的数据统计示例
2020/02/17 Python
python实现图片素描效果
2020/09/26 Python
Django中的DateTimeField和DateField实现
2021/02/24 Python
利用CSS3 动画 绘画 圆形动态时钟
2018/03/20 HTML / CSS
葡萄牙鞋子品牌:Fair
2016/12/10 全球购物
编写一个类体现构造,公有,私有方法,静态,私有变量
2013/08/10 面试题
售后服务经理岗位职责范本
2014/02/22 职场文书
求职简历自荐信
2014/06/18 职场文书
英语四级考试作弊检讨书
2014/09/29 职场文书
宇宙与人观后感
2015/06/05 职场文书
小型婚礼主持词
2015/06/30 职场文书
中学教师读书笔记
2015/07/01 职场文书
《七月的天山》教学反思
2016/02/19 职场文书
PyCharm配置KBEngine快速处理代码提示冲突、配置命令问题
2021/04/03 Python
ubuntu下常用apt命令介绍
2022/06/05 Servers