diff options
Diffstat (limited to 'src/ee/digikey/__init__.py')
-rw-r--r-- | src/ee/digikey/__init__.py | 57 |
1 files changed, 27 insertions, 30 deletions
diff --git a/src/ee/digikey/__init__.py b/src/ee/digikey/__init__.py index a318024..b993c31 100644 --- a/src/ee/digikey/__init__.py +++ b/src/ee/digikey/__init__.py @@ -16,6 +16,7 @@ from selenium import webdriver import ee._utils from ee import EeException from ee.money import Money, get_default_context +from ee.part import Category from ee.tools import mk_parents money = get_default_context() @@ -135,12 +136,13 @@ class Document(object): @total_ordering class DigikeyProduct(object): - def __init__(self, part_number, mpn, url, attributes: List["DigikeyAttributeValue"] = None, categories=None): + def __init__(self, part_number, mpn, url, attributes: List["DigikeyAttributeValue"] = None, + categories: List[Category] = None): self.part_number = _clean(part_number) self.mpn = _clean(mpn) self.url = url self.attributes = attributes or [] # type: List["DigikeyAttributeValue"] - self.categories = categories or [] + self.categories = categories or [] # type: List[Category] self.quantity_available = None self.description = None self.price_breaks: List[PriceBreak] = [] @@ -158,6 +160,10 @@ class DigikeyProduct(object): def __hash__(self): return self.part_number.__hash__() + @property + def uri(self): + return "https://digikey.com/pn#{}".format(self.part_number) + def attribute_by_id(self, _id): return next((a for a in self.attributes if a.attribute_type.id == _id), None) @@ -228,33 +234,6 @@ class DigikeyAttributeValue(object): assert self.attribute_type -@total_ordering -class DigikeyProductCategory(object): - def __init__(self, _id, label, digikey_url=None, parent=None): - self.id = _clean(_id) - self.label = _clean(label) - self.digikey_url = digikey_url if digikey_url is None or digikey_url.startswith("http") else \ - "https://www.digikey.com" + digikey_url - self.parent: DigikeyProductCategory = parent - self.subCategories: List[DigikeyProductCategory] = [] - - assert self.id - assert self.label - - def __eq__(self, other: "DigikeyProductCategory"): - return self.id == other.id - - def __lt__(self, other: "DigikeyProductCategory") -> bool: - return self.label < other.label - - def add_sub_category(self, _id, label, digikey_url): - sc = DigikeyProductCategory(_id, label, digikey_url=digikey_url, parent=self) - self.subCategories.append(sc) - - def find_sub_category_by_label(self, label): - return next((sc for sc in self.subCategories if sc.label == label), None) - - class SearchResponseTypes(enum.Enum): MANY = 1 # A product table was returned. SINGLE = 2 # A product page was returned @@ -413,6 +392,24 @@ class DigikeyParser(object): a_type = self.digikey.get_attribute_type(attribute_type_id, label) attributes.append(DigikeyAttributeValue(value, a_type)) + # links = tree.xpath("//table[@id='product-attribute-table']//*[class='attributes-td-categories-link']") + links = tree.xpath("//*[@class='attributes-td-categories-link']/a") + parent = None + for a in links: + name = _clean(a.text) + href = _clean(a.get("href")) + if not href: + continue + m = re.fullmatch(".*/([0-9]+)", href) + href = self.ensure_absolute_url(origin_url, href) + + if m and name and href: + category_id = m.group(1) + uri = "https://digikey.com/category#{}".format(category_id) + c = Category(uri, name, href, parent) + parent = c + categories.append(c) + if part_number and mpn: p = DigikeyProduct(part_number, mpn, url, attributes, categories) p.price_breaks = self._parse_price_breaks(tree) @@ -565,7 +562,7 @@ class DigikeyParser(object): return DigikeySearchResponse(1, SearchResponseTypes.NO_MATCHES) @staticmethod - def ensure_absolute_url(origin_url, url): + def ensure_absolute_url(origin_url, url: Optional[str]): if url is None: return |