最近利用python处理了两千多个html文件,对每一个html中的img标签中的图片进行了base64加密,感觉python还是很强大的,其中自有的base64库真的是非常方便,简单的一行就能实现base64的加密和解密,简洁而高效。
同时,这次还用到了BeautifulSoup库,这是自上次爬虫之后再次使用(爬虫见我之前的博客),我并没有想到这个库也能用在这里,看来这个库也十分强大。
- 首先,明确一下需求:
一共几千条本地的html(分别处在三层文件夹子目录下),需要对每一个html中img标签下的图片文件进行base64加密,将原来html中的文字路径改写为base64加密后的字符,即将html中的图片文件明文改写为暗文,之后将两千多个html抽取并另存为到路径下。
- 然后,总结一下遇到的几个困难吧:
1.用python操作静态html:
这是我在实习功能时遇到的第一个,也是最让我头疼 的困难,因为确实在网上,我几乎找不到有关操作本地静态html的py方法,几乎绝大部分是直接爬取在线html,也确实,操作本地html也几乎没有什么意义吧,可偏偏我就遇到了这种需求,很蓝瘦香菇,但我不说…
2.读取html文件内容:
在我发现用beautifulsoup之前,我真的没有找到好用的方法来提取html文件内容,可能利用读写文件方法可以成功,但经过我的尝试并不行,感觉问题是出在路径上,然而我还是没找到什么有效的解决方法,然后我抛弃了这种方法…
3.读取文件路径:
我拿到手的html在近三千个有三层树状结构的文件夹层次下,所以遍历文件夹层次也费了一些功夫…
- 其次,我的程序编写思路:
1.soup获取html内容,
2.利用soup获取的内容加密后改写soup,
3.将soup写入文件,另存
- 还有,学习总结:
1.用request.urlopen()打开读取静态(本地)html文件时,在路径前加一个file:///切记是三个/,eg:file:///c:/desktop/…
2.base64是对图片文件进行加密,切记是图片文件本身,即是对图片文件
3.beautifulsoup配合lxml解析静态html并获取内容:oup=BeautifulSoup(html,‘lxml’)
- 最后,关键代码:
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()