77@dataclass
88class WildberriesProduct :
99
10- __version__ = "0.2 "
10+ __version__ = "0.3 "
1111 __base_link = "https://www.wildberries.ru"
1212
1313 page_link : str = field (init = True ) # ссылка на страницу товара
1414 title : str = field (init = True ) # название товара
1515 seller : str = field (init = False ) # название продавца
16- seller_score : Optional [float ] = field (init = False , default = None ) # средняя оценка продавцы
16+ seller_score : Optional [float ] = field (init = False , default = None ) # средняя оценка продавца
1717 brand : Optional [str ] = field (init = False ) # бренд товара
1818 article : int = field (init = False ) # артикул товара
19- price_wb_wallet : int = field (init = False ) # цена товара с wb кошельком
20- price : int = field (init = False ) # цена товара со скидкой
21- old_price : int = field (init = False ) # старая цена товара
19+ price_wb_wallet : Optional [ int ] = field (init = False ) # цена товара с wb кошельком
20+ price : Optional [ int ] = field (init = False ) # цена товара со скидкой
21+ old_price : Optional [ int ] = field (init = False ) # старая цена товара
2222 score : Optional [float ] = field (init = False ) # средняя оценка товара
2323 reviews : Optional [int ] = field (init = False ) # количество отзывов на товар
2424 category : Optional [str ] = field (init = False ) # категория товара
2525 seller_goods : Optional [str ] = field (init = False ) # ссылка на товары бренда
2626 same_category : str = field (init = False ) # ссылка на товары той же категории
2727 refund : Optional [str ] = field (init = False ) # возможность возврата
2828 seller_lvl : Optional [str ] = field (init = False , default = None ) # уровень продавца
29- sold_goods : Optional [str ] = field (init = False , default = None ) # сколько товаров было продано продавцом
29+ sold_goods : Optional [int ] = field (init = False , default = None ) # сколько товаров было продано продавцом
3030 on_market : Optional [str ] = field (init = False , default = None ) # сколько продавец на рынке
3131 description : str = field (init = False ) # описание товара
3232
@@ -35,7 +35,7 @@ def dict(self):
3535 return {k : v for k , v in asdict (self ).items ()}
3636
3737 def __setattr__ (self , key : str , value : Optional [Union [str , ElementHandle ]]):
38- """version = 0.3 """
38+ """version = 0.4 """
3939 if key in ("seller" , "title" , "refund" , "description" ):
4040 value = self .__inner_text (value )
4141 elif key in ("price_wb_wallet" , "price" , "old_price" , "reviews" ):
@@ -45,18 +45,14 @@ def __setattr__(self, key: str, value: Optional[Union[str, ElementHandle]]):
4545 elif key == "article" :
4646 value = int (self .__inner_text (value ))
4747 elif key == "brand" :
48- value = self .__inner_text (value .query_selector ('a' ))
49- value = value if value != '' else None
48+ value = value if (value := self .__inner_text (value .query_selector ('a' ))) != '' else None
5049 elif key == "score" :
51- value = self .__inner_text (value )
52- value = re .search (r'[\d\s\.]+(?=\n)' , value ) if value else None
53- value = float (value .group (0 )) if value else None
50+ value = re .search (r'[\d\s\.]+(?=\n)' , value ) if (value := self .__inner_text (value )) else None
51+ value = float (value [0 ]) if value else None
5452 elif key == "seller_score" :
5553 value = float (self .__inner_text (value ))
5654 elif key == "category" :
5755 value = self .__inner_text (value ).replace ('\n ' , '/' )
58- elif key == "sold_goods" :
59- value = self .__format_number (value )
6056 super ().__setattr__ (key , value )
6157
6258 @staticmethod
@@ -77,6 +73,16 @@ def __href(value: Optional[ElementHandle]) -> Optional[str]:
7773 @staticmethod
7874 def __format_number (number : str ) -> Optional [int ]:
7975 """Форматирование целочисленных атрибутов с присутствием нечисловых символов
80- version = 0.2.1
76+ version = 0.3
77+ """
78+ return int (number ) if (number := re .sub (r'[^\d]' , '' , number ) if number else None ) else None
79+
80+ def parse_seller_descr (self , seller_data : Optional [ElementHandle ]) -> None :
81+ """Парсинг доп информации о поставщике - уровень поставщика, сколько товаров продано, сколько времени на рынке
82+ version = 0.1
8183 """
82- return int (re .sub (r'[^\d]' , '' , number )) if number else None
84+ if seller_data :
85+ level = re .search (r".+(?= У)" , seller_data := seller_data .inner_text ().replace ("\n " , " " ))
86+ self .seller_lvl = level [0 ] if level else None
87+ self .sold_goods = int (re .sub (r'[^\d]' , '' , re .search (r"(?:(?<= )|(?<=^))[\d\s]+(?= Т)" , seller_data )[0 ]))
88+ self .on_market = re .search (r"(?<=[он] ).+(?= Н)" , seller_data )[0 ]
0 commit comments