利用python对大量html文件的图片内容进行base64加密

159 阅读3分钟

最近利用python处理了两千多个html文件,对每一个html中的img标签中的图片进行了base64加密,感觉python还是很强大的,其中自有的base64库真的是非常方便,简单的一行就能实现base64的加密和解密,简洁而高效。
同时,这次还用到了BeautifulSoup库,这是自上次爬虫之后再次使用(爬虫见我之前的博客),我并没有想到这个库也能用在这里,看来这个库也十分强大。

  1. 首先,明确一下需求:

一共几千条本地的html(分别处在三层文件夹子目录下),需要对每一个html中img标签下的图片文件进行base64加密,将原来html中的文字路径改写为base64加密后的字符,即将html中的图片文件明文改写为暗文,之后将两千多个html抽取并另存为到路径下。

  1. 然后,总结一下遇到的几个困难吧:

1.用python操作静态html:
这是我在实习功能时遇到的第一个,也是最让我头疼 的困难,因为确实在网上,我几乎找不到有关操作本地静态html的py方法,几乎绝大部分是直接爬取在线html,也确实,操作本地html也几乎没有什么意义吧,可偏偏我就遇到了这种需求,很蓝瘦香菇,但我不说…
2.读取html文件内容:
在我发现用beautifulsoup之前,我真的没有找到好用的方法来提取html文件内容,可能利用读写文件方法可以成功,但经过我的尝试并不行,感觉问题是出在路径上,然而我还是没找到什么有效的解决方法,然后我抛弃了这种方法…
3.读取文件路径:
我拿到手的html在近三千个有三层树状结构的文件夹层次下,所以遍历文件夹层次也费了一些功夫…

  1. 其次,我的程序编写思路:

1.soup获取html内容,
2.利用soup获取的内容加密后改写soup,
3.将soup写入文件,另存

  1. 还有,学习总结:

1.用request.urlopen()打开读取静态(本地)html文件时,在路径前加一个file:///切记是三个/,eg:file:///c:/desktop/…
2.base64是对图片文件进行加密,切记是图片文件本身,即是对图片文件
3.beautifulsoup配合lxml解析静态html并获取内容:oup=BeautifulSoup(html,‘lxml’)

  1. 最后,关键代码:
import base64
from bs4 import BeautifulSoup
from urllib import request

def readAndWrite(html_url,modified_name,png_parent):#html路径,改写后html文件名,html文件中图片的父文件夹路径
    sl=[]
    sc=[]
    url=request.urlopen(html_url)#打开html
    #print(html_url)
    html=url.read()#获取html内容
    soup=BeautifulSoup(html,'lxml')#利用soup解析内容放在soup
    for e in soup.find_all('img'):#找到img标签
        sl.append(e.get('src'))  #找到img标签里的若干个图片明文路径src
    for sx in sl:
        #print(png_parent+sx)
        if '%20'in sx:
            sx=sx.replace('%20',' ')#原来文件中的空格为%20,这里去掉
        with open(png_parent+sx,'rb')as f:
            t=str(base64.b64encode(f.read()))base64加密
            sc.append(t[2:-1])#base64加密字段提取
            #print(t+'\n')
        f.close()
    tag=soup.find('img')#找到soup标签
    for e in sc:
        tag['src']='data:img/jpg;base64,'+e#base64j加密改写
        tag=tag.find_next('img')
    with open('base64/'+modified_name+'.html','w',encoding='utf-8')as f:#另存改写后的html
        f.write(str(soup))
        f.close()
        
def main():
    path=[]
    name=[]
    ht=[]
    s=0
    with open('fname.txt','r',encoding='utf-8')as f:#读取写在txt中的所以html文件路径
        t=f.readlines()
    f.close()
    for p in t:
        path.append(p[:-1])
    #print(path)#路径
    with open('htm_name.txt','r',encoding='utf-8')as f:#读取改写后的html文件名字
        t=f.readlines()
    f.close()
    for p in t:
        name.append(p[:-4])
    #print(name)#加密后的html名字
    with open('parentpath.txt','r',encoding='utf-8')as f:#读取html中图片文件的父文件夹路径,之前已写在txt **加粗样式**
        t=f.readlines()
    f.close()
    for p in t:
        ht.append(p[:-1])
    #png父目录
    for a,b,c in zip(path,name,ht):
        #print(b)
        readAndWrite(a,b,c)#改写函数
        s=s+1
        #print('modified N.\n',s)    
        #print(a,b)
  
main()