日本免费高清视频-国产福利视频导航-黄色在线播放国产-天天操天天操天天操天天操|www.shdianci.com

學無先后,達者為師

網站首頁 編程語言 正文

ECommerceCrawlers項目分析(十二)

作者:enwwen 更新時間: 2021-12-18 編程語言

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坐標為索引,子串整體作為一個元素。

原文鏈接:https://blog.csdn.net/weixin_45859345/article/details/122136619

欄目分類
最近更新