PaiGram/models/wiki/material.py
Karako 91a133b694
♻️ 重写 wiki 模块和相关插件
1. 使用 `pydantic` 重写了 wiki 模块所使用的 model
2. 添加了 weapon_level.json 用于后续计算武器升级所需的经验
3. 修改了 wiki 插件,以适应新的 model
2022-08-28 22:37:31 +08:00

58 lines
1.7 KiB
Python

import re
from typing import List
from bs4 import BeautifulSoup
from httpx import URL
from typing_extensions import Self
from models.wiki.base import SCRAPE_HOST, WikiModel
__all__ = ['Material']
class Material(WikiModel):
"""材料
Attributes:
type: 类型
source: 获取方式
description: 描述
serise: 材料系列
"""
type: str
source: List[str]
description: str
@staticmethod
def scrape_urls() -> List[URL]:
return [SCRAPE_HOST.join(f'fam_wep_{i}/?lang=CHS') for i in ['primary', 'secondary', 'common']]
@classmethod
async def _parse_soup(cls, soup: BeautifulSoup) -> Self:
"""解析材料页"""
soup = soup.select('.wp-block-post-content')[0]
tables = soup.find_all('table')
table_rows = tables[0].find_all('tr')
def get_table_text(row_num: int) -> str:
"""一个快捷函数,用于返回表格对应行的最后一个单元格中的文本"""
return table_rows[row_num].find_all('td')[-1].text.replace('\xa0', '')
id_ = re.findall(r'/img/(.*?)\.webp', str(table_rows[0]))[0]
name = get_table_text(0)
rarity = len(table_rows[3].find_all('img'))
type_ = get_table_text(1)
source = list(
filter(
lambda x: x, # filter 在这里的作用是过滤掉为空的数据
table_rows[-2].find_all('td')[-1].encode_contents().decode().split('<br/>')
)
)
description = get_table_text(-1)
return Material(id=id_, name=name, rarity=rarity, type=type_, source=source, description=description)
@property
def icon(self) -> str:
return str(SCRAPE_HOST.join(f'/img/{self.id}.png'))