diff --git a/DrissionPage/driver_element.py b/DrissionPage/driver_element.py index 82e3c38..b12fc47 100644 --- a/DrissionPage/driver_element.py +++ b/DrissionPage/driver_element.py @@ -71,19 +71,31 @@ class DriverElement(DrissionElement): @property def parent(self): """父级元素""" - loc = 'xpath', './..' - return self.ele(loc, timeout=1, show_errmsg=False) + return self.parents() @property def next(self): """下一个兄弟元素""" - loc = 'xpath', './following-sibling::*[1]' - return self.ele(loc, timeout=1, show_errmsg=False) + return self.nexts() @property def prev(self): """上一个兄弟元素""" - loc = 'xpath', './preceding-sibling::*[1]' + return self.prevs() + + def parents(self, num: int = 1): + """N层父级元素""" + loc = 'xpath', f'.{"/.." * num}' + return self.ele(loc, timeout=1, show_errmsg=False) + + def nexts(self, num: int = 1): + """下N个兄弟元素""" + loc = 'xpath', f'./following-sibling::*[{num}]' + return self.ele(loc, timeout=1, show_errmsg=False) + + def prevs(self, num: int = 1): + """上N个兄弟元素""" + loc = 'xpath', f'./preceding-sibling::*[{num}]' return self.ele(loc, timeout=1, show_errmsg=False) def attr(self, attr: str) -> str: diff --git a/DrissionPage/session_element.py b/DrissionPage/session_element.py index fd9659f..2192b56 100644 --- a/DrissionPage/session_element.py +++ b/DrissionPage/session_element.py @@ -49,28 +49,43 @@ class SessionElement(DrissionElement): return self._inner_ele.tag @property - def parent(self) -> Union[DrissionElement, None]: - """requests_html的Element打包了lxml的元素对象,从lxml元素对象读取上下级关系后再重新打包""" - try: - return SessionElement(Element(element=self.inner_ele.element.xpath('..')[0], url=self.inner_ele.url)) - except IndexError: - return None + def parent(self): + """父级元素""" + return self.parents() @property - def next(self) -> Union[DrissionElement, None]: + def next(self): + """下一个兄弟元素""" + return self.nexts() + + @property + def prev(self): + """上一个兄弟元素""" + return self.prevs() + + def parents(self, num: int = 1): """requests_html的Element打包了lxml的元素对象,从lxml元素对象读取上下级关系后再重新打包""" try: return SessionElement( - Element(element=self.inner_ele.element.xpath('./following-sibling::*[1]')[0], url=self.inner_ele.url)) + Element(element=self.inner_ele.element.xpath(f'..{"/.." * (num - 1)}')[0], url=self.inner_ele.url)) except IndexError: return None - @property - def prev(self) -> Union[DrissionElement, None]: + def nexts(self, num: int = 1): """requests_html的Element打包了lxml的元素对象,从lxml元素对象读取上下级关系后再重新打包""" try: return SessionElement( - Element(element=self.inner_ele.element.xpath('./preceding-sibling::*[1]')[0], url=self.inner_ele.url)) + Element(element=self.inner_ele.element.xpath(f'./following-sibling::*[{num}]')[0], + url=self.inner_ele.url)) + except IndexError: + return None + + def prevs(self, num: int = 1): + """requests_html的Element打包了lxml的元素对象,从lxml元素对象读取上下级关系后再重新打包""" + try: + return SessionElement( + Element(element=self.inner_ele.element.xpath(f'./preceding-sibling::*[{num}]')[0], + url=self.inner_ele.url)) except IndexError: return None