有些网站的文字内容使用雪碧图加密,
网站显示的内容
源代码的内容
雪碧图
css
网站根据css精灵图坐标渲染页面,首先我们要把css拿下来存到本地,然后筛选自己需要的
import re,requests
from lxml import etree
with open('111.css','r',encoding='utf-8') as f:
a = f.read()
b= re.sub(r'\s','',a)
b=re.findall(r'(xpy[\d\D]*?})',b)
css_list=[]
for i in b:
b=re.findall(r'(.*?){background:-(.*?)px-(.*?)px;}',i)
a=b[0] #元祖
a = list(a) #转为列表
css_list.append(a)
#用正则筛选css中渲染文字的所有属性
#筛选后的格式:[['name1','x轴坐标','y轴坐标'],['name2','x轴坐标','y轴坐标'],]
筛选后的内容
arrtlist=[]
for i in css_list:
alist=[i[0],float(i[1]),float(i[2])]
arrtlist.append(alist)
#把坐标转为数字格式
sortlist=sorted(arrtlist,key=lambda x: (x[2],x[1]))
#先根据行排序,再根据列排序,
num=[]
for i in sortlist:
if i[2] not in num:
num.append(i[2])
#取出每一行的坐标,去重
print(num)
num_list={}
for i in sortlist:
if i[2] in num:
num_list[i[2]]=i[1]+14
#14,为每一个字的宽度
#取出每一行的宽度,以行坐标作为字典的键,值作为值
vel=[]
for i in num_list:
vel.append(num_list[i])
vel.insert(0,0)
#在最前面添加一个0,因为第一行不需要添加上一行宽度
sumall=[]
vellist=0
for i in vel:
vellist+=i
sumall.append(vellist)
#让每一个值等于全面的所有值相加,
print(sumall)
key_ve={}
for i in range(len(num)):
key_ve[num[i]]=sumall[i]
#使每一行的坐标对应添加前几行的宽度和
dictlist={}
for i in sortlist:
for j in key_ve:
if i[2] == j:
# dictlist.append(i[1]+key_ve[j])
dictlist[i[0]]=int((key_ve[j]+i[1])/14)
print(dictlist)
#循环css列表,使name对应索引
with open('miwen.txt','r',encoding='utf-8') as f:
wenzilist=f.read()
wenzilist=re.sub(r' ','',wenzilist)
#读取雪碧图,去掉空格,使全部值成为一行
for i in dictlist:
dictlist[i]=wenzilist[dictlist[i]]
最后dictlist字典就是css名对应着雪碧图中的文字