python 解析html之BeautifulSoup

 更新时间:2009年07月07日 17:07:23   作者:  
项目里需要解析html,采用python语言实现,发现了BeautifulSoup这个好用的东西,写了一个程序,可能大家不知道,干什么用的,目的是让大家知道如何使用 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";

        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练习之读取XML节点和属性值的方法

    Python练习之读取XML节点和属性值的方法

    这篇文章主要介绍了Python练习之读取XML节点和属性值的方法,通过parse函数可以读取XML文档,该函数返回ElementTree类型的对象,通过该对象的iterfind方法可以对XML中特定节点进行迭代
    2022-06-06
  • 四行Python3代码实现图片添加美颜效果

    四行Python3代码实现图片添加美颜效果

    这篇文章主要为大家介绍了如何利用Python语言实现给图片添加美颜效果,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起了解一下
    2022-04-04
  • Python中print()函数使用实例详解

    Python中print()函数使用实例详解

    Python的print()函数可以打印输出,常用来将内容打印到控制台,print()是python中最常见的一个函数,本文就通过一些实例来给大家讲讲如何使用print()函数,需要的朋友可以参考下
    2023-07-07
  • Python实现高斯函数的三维显示方法

    Python实现高斯函数的三维显示方法

    今天小编就为大家分享一篇Python实现高斯函数的三维显示方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-12-12
  • python实现简单flappy bird

    python实现简单flappy bird

    这篇文章主要为大家详细介绍了python实现简单flappy bird小游戏,具有一定的参考价值,感兴趣的小伙伴们可以参考一下
    2018-12-12
  • Python字典和集合讲解

    Python字典和集合讲解

    这篇文章主要给大家假关节的是Python字典和集合,字典是Python内置的数据结构之一,是一个无序的序列;而集合是python语言提供的内置数据结构,没有value的字典,集合类型与其他类型最大的区别在于,它不包含重复元素。想具体了解有关python字典与集合,请看下面文章内容
    2021-10-10
  • 自定义Django默认的sitemap站点地图样式

    自定义Django默认的sitemap站点地图样式

    这篇文章主要介绍了自定义Django默认的sitemap站点地图样式,通过代码给大家介绍了使用Django的sitemap功能,代码很简单非常不错对大家的工作或学习具有一定的参考借鉴价值,需要的朋友可以参考下
    2020-03-03
  • 解析python 类方法、对象方法、静态方法

    解析python 类方法、对象方法、静态方法

    这篇文章主要介绍了解析python 类方法、对象方法、静态方法的的相关资料,帮助大家更好的理解和学习python,感兴趣的朋友可以了解下
    2020-08-08
  • 用python编写一个图片拼接工具

    用python编写一个图片拼接工具

    大家好,本篇文章主要讲的是用python编写一个图片拼接工具,感兴趣的同学赶快来看一看吧,对你有帮助的话记得收藏一下
    2022-01-01
  • Django CBV与FBV原理及实例详解

    Django CBV与FBV原理及实例详解

    这篇文章主要介绍了Django CBV与FBV原理及实例详解,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
    2019-08-08

最新评论