1.页面看到的文字实际由另一个字经过字体库映射而得
2.网页会在加载的时候载入字体库 (可能有多个字体库),将此字体下载下来,通过font creator(字体工具)打开可以看到对应表,遍找到了映射关系。(笨方法到这直接对着写map就可以了)
3.用python 将.woff的字体文件 转成 XML 读取其中的映射。下图为第一层映射,根据code 可以得到 name (简单的一步映射就直接能得到结果)。
4.天眼查这个还需要再做一层,如图将上一步得到的name值 映射得到id值 ,这个id值就是 刚才fontcreator 看到的汉字的排序。在这里做个map对应即可得到映射汉字。
5.上述方法也还是要写一个map 。下图是"_#103" 所对应的字形,python的这个库肯定有一个方法直接根据字形得到汉字的 ,不然贼蠢,但我没找到。。。欢迎大家补充一下。
附录代码:
from fontTools import unichr
from fontTools.ttLib import TTFont
import re
'''
解析字体方法1:
'''
font = TTFont('./tyc-num.woff') # 打开文件
# font.saveXML('./tyc-num.xml')
mappings = {}
for k, v in font.getBestCmap().items():
if v.startswith('uni'):
# 形如 <map code="0xe040" name="uni45"/> 可直接转换得到结果
mappings['{:x}'.format(k)] = unichr(int(v[3:], 16))
else:
mappings['{:x}'.format(k)] = v
key = re.search('.*u([0-9a-f]{4}).*', str('电'.encode('unicode_escape'))).group(1)
value = mappings[key]
# 得到另一个映射
id = font.getGlyphID(value)
# 根据下载的字体弄个map 再根据 id做key 获取对应value
maps = {'1': '苏', '2': '你'}
完