ECommerceCrawlers项目分析(十二)

2021SC@SDUSC

本篇文章将对dazhong.py的_get_font_dict_by_offset核心函数进行分析

在本项目中,一个文字有一个标签,相同字体有相同的标签,一个标签对应一对xy坐标

因此通过获取xy坐标来获取文字。

完整代码如下:

    def _get_font_dict_by_offset(self, url):
        """
            获取坐标偏移的文字字典, 会有最少两种形式的svg文件(目前只遇到两种)
        """
        res = requests.get(url,timeout=60)
        # res.text 之时,Requests 会使用其推测的文本编码。
        html = res.text
        font_dict = {}
        # 正则表达式re.findall,返回string中所有与pattern匹配的全部字符串,返回形式为数组。
        y_list = re.findall(r'd="M0 (\d+?) ', html)

        # 如果y_list不为空,即找到了符合的字符串
        if y_list:
            font_list = re.findall(r'<textPath .*?>(.*?)<', html)
            # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,
            # 一般用在 for 循环当中。
            for i, string in enumerate(font_list):
                # 记录下y坐标
                y_offset = self.start_y - int(y_list[i])

                sub_font_dict = {}
                for j, font in enumerate(string):
                    # 记录下x坐标
                    x_offset = -j * self.font_size
                    sub_font_dict[x_offset] = font

                font_dict[y_offset] = sub_font_dict

        # 没找到符合的字符串的情况
        else:
            font_list = re.findall(r'<text.*?y="(.*?)">(.*?)<', html)

            for y, string in font_list:
                y_offset = self.start_y - int(y)
                sub_font_dict = {}
                for j, font in enumerate(string):
                    x_offset = -j * self.font_size
                    sub_font_dict[x_offset] = font

                font_dict[y_offset] = sub_font_dict
        print('字体字典',font_dict)
        return font_dict

首先,通过正则表达式获取对应的css样式

res = requests.get(url,timeout=60)
        # res.text 之时,Requests 会使用其推测的文本编码。
        html = res.text
        font_dict = {}
        # 正则表达式re.findall,返回string中所有与pattern匹配的全部字符串,返回形式为数组。
        y_list = re.findall(r'd="M0 (\d+?) ', html)

如果存在,则进入if语句,如果不存在则进入else语句。

if,else语句里的代码块内容相似,它们都实现了相同的功能:得到与文字相关的xy坐标

            font_list = re.findall(r'<textPath .*?>(.*?)<', html)
            # enumerate() 函数用于将一个可遍历的数据对象(如列表、元组或字符串)组合为一个索引序列,同时列出数据和数据下标,
            # 一般用在 for 循环当中。
            for i, string in enumerate(font_list):
                # 记录下y坐标
                y_offset = self.start_y - int(y_list[i])

                sub_font_dict = {}
                for j, font in enumerate(string):
                    # 记录下x坐标
                    x_offset = -j * self.font_size
                    sub_font_dict[x_offset] = font

                font_dict[y_offset] = sub_font_dict

这里给出svg样例来进行说明

svg内容样例`<text x="0" y="46">历分爆</text>`

```
<text x="0" y="46">历分爆锅父碰茅恐寸矮异唐险乓绢梢菊装罗拘欲则悲鹊北奉慕袄限洞都凶千密暮达快容糖秧澡私</text>
<text x="0" y="85">扔品惕倦南观只死夺刊浑糠扭康淡蛛妄冶夫捡喷脚情项遵发滋铜灌锣垫盲极歉事讲腰押穿果或廉</text>
<text x="0" y="129">趁鼓鸽幼翅脖尼畅抽遗绸删被海乞肺识垄素湾齐室梦姑善朗皮乒助摄办长令胜炼搂陡漫场浪般价</text>
<text x="0" y="169">兔朱肝朽踪骡弓帝人腐津代典志解责博建酬阳出技必诗救窑摘堤扁峰焰虏孩骑御愉爸敌阀顿仇于</text>
<text x="0" y="218">挂遍等纷壮隶非猾匹会载岸萄置缎姜星龙珍深许构违势医夹首卜汁把嘱顶拿痛翁狱样枝销疑崇泻</text>
<text x="0" y="259">伞追困到惜系伍奔贸野云蛇炮虫童供内猜忍轿沙布执挑如得呀境祸岗饮又乡灿搜扣脂遇中乙迈缺</text>
<text x="0" y="307">沟勺瓶毛岂宙汉奏愈返们姿化普压连宾货截您唇璃兰雨染墨恢棕植灰垮茶右敞为太杰隙香雹将呆</text>
<text x="0" y="350">稳柄劳督仰股轧扎崖我悼影饱专药给职逮剃耽骗拳尘提摧践瑞谈饺杨渔占孝亭林娃晃鄙临央催箱</text>

它先记录下y坐标,然后对子串再进行分解,通过计算生成新的x坐标。以x坐标为索引,重新构建子串。然后再以相应的y坐标为索引,子串整体作为一个元素。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值