def siblings(element: Element, including=False): """ get siblings of element :param element: :param including: include current element or not :return: """ if element is None: return [] if including: yield element for sibling in element.itersiblings(preceding=True): if isinstance(sibling, HtmlElement): sibling.__class__ = Element yield sibling for sibling in element.itersiblings(preceding=False): if isinstance(sibling, HtmlElement): sibling.__class__ = Element yield sibling
def path(element: Element): """ get tag path using recursive function. for example result: html/body/div/div/ul/li :param element: :return: """ if element is None: return '' result = path_raw(element) # get nth-child nth = len(list(element.itersiblings(preceding=True))) + 1 result += f':nth-child({nth})' if nth != 1 else '' return result
def alias(element: Element): """ get alias of element, concat tag and attribs :param element: :return: """ if element is None: return '' tag = element.tag attribs = [tag] for k, v in element.attrib.items(): k, v = re.sub(r'\s*', '', k), re.sub(r'\s*', '', v) attribs.append(f'[{k}="{v}"]' if v else f'[{k}]') result = ''.join(attribs) # get nth-child nth = len(list(element.itersiblings(preceding=True))) + 1 result += f'::nth-child({nth})' if nth != 1 else '' return result