python 学习 requests+fonttools应用

最近在学习python,由于是业余选手,所以到处搜相关资料,但网上的资料大多是不完整的,并不能满足自己的需要,每每要经过不停的试错最终达到想要的目标。

经过几天的努力,最终搞定了。于是写下第一篇文以记之。也给同样遇到此类问题的后来者一个参考。

工作环境为:pycharm+Anaconda

用到的模块:requests  lxml  fontTools

目标:将网文的+密数据转化为正常数据

直奔主题,打开网文第一章页面,F12,可以看到:

 

 

 

 这里明显可以看到乱码,数据是+密的,找到+密的Font文件才可以得到正确的数据,

直接下载字体文件font.ttf,用 FontCreator软件打开该文件,可以看到

 

共的100个汉字,此时需要TTFont模块来找到字体映射列表, 

 
font = TTFont('font.ttf')
uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder() 
print(uni_list)得到一串字符:
['.notdef', 'uniE800', 'uniE801', 'uniE802', 'uniE803', 'uniE804', 'uniE805', 'uniE806', 'uniE807', 'uniE808', 'uniE809', 'uniE80A', 'uniE80B', 'uniE80C', 'uniE80D', 'uniE80E', 'uniE80F', 'uniE810', 'uniE811', 'uniE812', 'uniE813', 'uniE814', 'uniE815', 'uniE816', 'uniE817', 'uniE818', 'uniE819', 'uniE81A', 'uniE81B', 'uniE81C', 'uniE81D', 'uniE81E', 'uniE81F', 'uniE820', 。。。 'uniE863'] ,其中'.notdef'表示空字符,剩下100组字符串与100个汉字对应。

字符替换后,得到正确的内容。

 完整代码如下:

import requests
from lxml import etree
from fontTools.ttLib import TTFont

headers = {'user-agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/94.0.4606.61 Safari/537.36 Edg/94.0.992.31', 'content-type': 'text/html; 'charset=utf-8'}
url = 'https://www.x x s+y.net/chapter/85558484.html'
response = requests.get(url, headers=headers)
response_html = response.content.decode('utf-8')
response_xml = etree.HTML(response_html)
content_list = response_xml.xpath('//div[2]/div/div/div[1]//*[@class="chapter-section"]//text()')
content_str = ''.join(content_list)
font = TTFont('font.ttf')
uni_list = font['cmap'].tables[0].ttFont.getGlyphOrder()  # 字体映射表
utf_list = [eval(r"u'\u" + x[3:] + "'") for x in uni_list[1:]]
word_list = [u'的', u'一', u'是', u'了', u'我', u'不', u'人', u'在', u'他', u'有', u'这', u'个', u'上', u'们', u'来', u'到', u'时', u'大',
             u'地', u'为', u'子', 。。。。, u'动'] #完整见字表
for i in range(len(utf_list)):
    content_str = content_str.replace(utf_list[i], word_list[i])

print(content_str)

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值