获取数字(fontTools)...举个栗子

起点中文网的例子撒...

# pip install fontTools 是用于将woff这种字体文件转化成XML文件

# 1.每次都刷新字体font-face文件:https://qidian.gtimg.com/qd_anti_spider/XnXLddDL.woff,所以每次请求,都需要取截取这个字体文件的url地址(url一直在变)。
# 2.请求这个地址,将这个字体文件下载到本地,然后将.woff文件转化成.xml文件。
# 3.去页面的源代码中提取字符串(十进制的编码): 𘜐𘜑𘜑𘜎𘜏𘜏

# 4.将100112/100113这些十进制编码的数据转化成十六进制的数据;

# 5.根据这个十六进制的数据从xml文件中找到对应的map对象,提取map的name属性,然后再根据name属性的值,从number_dict中提取对应的值。

=====================================================================

点开之后可以看到--->


==============================================================

from fontTools.ttLib import TTFont

number_dict = {
    'period': '.',
    'zero': '0',
    'one': '1',
    'two': '2',
    'three': '3',
    'four': '4',
    'five': '5',
    'six': '6',
    'seven': '7',
    'eight': '8',
    'nine': '9',
}

url = 'https://book.qidian.com/info/1010734492'

import requests, re

response = requests.get(url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0'})

# 拿到下载字体的网址
# @font-face.*?src: url.*?src: url(.*?) format('woff'),
content = re.search(re.compile(r"@font-face.*?src: url.*?src: url(.*?)format.*?,", re.S), response.text)
# ('https://qidian.gtimg.com/qd_anti_spider/yMxThZoL.woff')
font_url = content.groups()[0].strip("( | )").strip("'")
print(font_url)

font_content = requests.get(font_url, headers={'User-Agent': 'Mozilla/5.0 (Windows NT 6.1; WOW64; rv:60.0) Gecko/20100101 Firefox/60.0'}).content

with open('qidian_lx.woff', 'wb') as f:
    f.write(font_content)

font1 = TTFont('qidian_lx.woff')
font1.saveXML('qidian_lx.xml')

# 源码中提取十进制数据:

data = re.findall(re.compile(r'<div class="book-info ">.*?<p>.*?<span class=".*?">(.*?)</span>.*?<span class=".*?">(.*?)</span>.*?<span class=".*?">(.*?)</span>.*?<span class=".*?">(.*?)</span>', re.S), response.text)[0]

print(data) # ('&#100152;&#100153;&#100153;&#100150;&#100157;&#100157;', '&#100157;&#100157;&#100146;&#100157;&#100150;&#100154;', '&#100146;&#100152;&#100150;&#100157;&#100151;', '&#100155;&#100148;&#100155;&#100150;&#100149;&#100154;')


four_list = []
# 遍历这四组数据
for d in data:
    # print(d)  # 拿到元组中的一个  &#100152;&#100153;&#100153;&#100150;&#100157;&#100157;
    one_list = []
    d = d.split(';') # 去除分号
    # 遍历每组数据
    for x in d:
        res = x.replace('&#', '')
        if res:  # 判断是否有空格有的话不转化
            # 将res十进制转化成16进制
            a = int(res)  # 先转化成int类型
            r = '%x' %a

            one_list.append(r)

    four_list.append(one_list)

print('----', four_list)


# 解析xml
import xml.etree.ElementTree as et
root = et.parse('qidian_lx.xml').getroot()
# 找到map那一堆标签(PyQuery)
map_ele = root.find('cmap').find('cmap_format_12').findall('map')
# print(map_ele)

map_dict = {}
# 把map那一堆数据存到字典中
for m in map_ele:
    # print(help(m))
    code = m.attrib['code'].replace('0x', '')
    map_dict[code] = m.attrib['name']  # code是键, name是值

print(map_dict)


# 遍历含有四组数据的列表
for one in four_list:
    two_string = ""
    # 遍历每一组数据
    for a in one:
        if a in map_dict:
            number = map_dict[a]  # 找到对应的键
            number = number_dict[number]  # 通过键找到对应的值

            two_string += number

    print(two_string)







猜你喜欢

转载自blog.csdn.net/qq_42336549/article/details/80698601