最近在学习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)