修改格式

This commit is contained in:
g1879 2020-11-10 17:57:48 +08:00
parent 8d49d9accb
commit 9b3158b866
5 changed files with 863 additions and 357 deletions

View File

@ -68,7 +68,7 @@ class DriverElement(DrissionElement):
if text_node_only:
return self.eles('xpath:./text()')
else:
return list(map(lambda x: x if isinstance(x, str) else x.text, self.eles('xpath:./node()')))
return [x if isinstance(x, str) else x.text for x in self.eles('xpath:./node()')]
@property
def html(self) -> str:
@ -348,8 +348,8 @@ class DriverElement(DrissionElement):
# 等待元素加载完成
if self.tag == 'img':
js = 'return arguments[0].complete && typeof arguments[0].naturalWidth != "undefined" ' \
'&& arguments[0].naturalWidth > 0'
js = ('return arguments[0].complete && typeof arguments[0].naturalWidth != "undefined" '
'&& arguments[0].naturalWidth > 0')
while not self.run_script(js):
pass
@ -587,8 +587,8 @@ class ElementsByXpath(object):
def __call__(self, ele_or_driver: Union[WebDriver, WebElement]) \
-> Union[str, DriverElement, None, List[str or DriverElement]]:
driver, the_node = (ele_or_driver, 'document') if isinstance(ele_or_driver, WebDriver) \
else (ele_or_driver.parent, ele_or_driver)
driver, the_node = ((ele_or_driver, 'document') if isinstance(ele_or_driver, WebDriver)
else (ele_or_driver.parent, ele_or_driver))
def get_nodes(node=None, xpath_txt=None, type_txt='7'):
"""用js通过xpath获取元素、节点或属性
@ -628,7 +628,7 @@ class ElementsByXpath(object):
return_txt = 'return e.singleNodeValue;'
js = """
var e=document.evaluate('""" + xpath_txt + """', """ + node_txt + """, null, """ + type_txt + """, null);
var e=document.evaluate('""" + xpath_txt + """', """ + node_txt + """, null, """ + type_txt + """,null);
""" + for_txt + """
""" + return_txt + """
"""
@ -637,8 +637,8 @@ class ElementsByXpath(object):
if self.mode == 'single':
try:
e = get_nodes(the_node, xpath_txt=self.xpath, type_txt='9')
return DriverElement(e, self.page, self.timeout) \
if isinstance(e, WebElement) else unescape(e).replace('\xa0', ' ')
return (DriverElement(e, self.page, self.timeout)
if isinstance(e, WebElement) else unescape(e).replace('\xa0', ' '))
# 找不到目标时
except JavascriptException:
@ -647,10 +647,7 @@ class ElementsByXpath(object):
elif self.mode == 'all':
e = get_nodes(the_node, xpath_txt=self.xpath)
# 去除元素间换行符
e = filter(lambda x: x != '\n', e)
# 去除元素间换行符并替换空格
e = (unescape(x).replace('\xa0', ' ') if isinstance(x, str) else x for x in e if x != '\n')
# 替换空格
e = map(lambda x: unescape(x).replace('\xa0', ' ') if isinstance(x, str) else x, e)
return list(map(lambda x: DriverElement(x, self.page, self.timeout) if isinstance(x, WebElement) else x, e))
return [DriverElement(x, self.page, self.timeout) if isinstance(x, WebElement) else x for x in e]

View File

@ -152,8 +152,8 @@ def check_driver_version(driver_path: str = None, chrome_path: str = None) -> bo
return True
except Exception as e:
info = f'''
出现异常
{e}chromedriver下载网址https://chromedriver.chromium.org/downloads
'''
出现异常
{e}chromedriver下载网址https://chromedriver.chromium.org/downloads
'''
print(info)
return False

View File

@ -192,7 +192,7 @@ class SessionElement(DrissionElement):
:param attr: 属性名
:return: 属性值文本没有该属性返回None
"""
try:
# try:
# 获取href属性时返回绝对url
if attr == 'href':
link = self.inner_ele.get('href')
@ -207,16 +207,21 @@ class SessionElement(DrissionElement):
elif attr == 'src':
return self._make_absolute(self.inner_ele.get('src'))
elif attr == 'text':
return self.text
elif attr == 'outerHTML':
return unescape(tostring(self._inner_ele).decode()).replace('\xa0', ' ')
elif attr == 'innerHTML':
return self.html
else:
return self.inner_ele.get(attr)
except:
return None
# except:
# return None
# -----------------私有函数-------------------
def _make_absolute(self, link):
@ -240,18 +245,23 @@ class SessionElement(DrissionElement):
"""获取css路径或xpath路径"""
path_str = ''
ele = self
while ele:
ele_id = ele.attr('id')
if ele_id:
return f'#{ele_id}{path_str}' if mode == 'css' else f'//{ele.tag}[@id="{ele_id}"]{path_str}'
else:
if mode == 'css':
brothers = len(ele.eles(f'xpath:./preceding-sibling::*'))
path_str = f'>:nth-child({brothers + 1}){path_str}'
else:
brothers = len(ele.eles(f'xpath:./preceding-sibling::{ele.tag}'))
path_str = f'/{ele.tag}[{brothers + 1}]{path_str}' if brothers > 0 else f'/{ele.tag}{path_str}'
ele = ele.parent
return path_str[1:] if mode == 'css' else path_str
def _get_brother(self, num: int = 1, mode: str = 'ele', direction: str = 'next'):
@ -316,23 +326,23 @@ def execute_session_find(page_or_ele,
# 用lxml内置方法获取lxml的元素对象列表
if loc[0] == 'xpath':
ele = page_or_ele.xpath(loc[1])
else: # 用css selector获取
else: # 用css selector获取元素对象列表
ele = page_or_ele.cssselect(loc[1])
# 把lxml元素对象包装成SessionElement对象并按需要返回第一个或全部
if mode == 'single':
ele = ele[0] if ele else None
if isinstance(ele, _Element):
return SessionElement(ele, page)
elif isinstance(ele, str):
return unescape(ele).replace('\xa0', ' ')
else:
return None
elif mode == 'all':
# 去除元素间换行符
ele = filter(lambda x: x != '\n', ele)
# 处理空格
ele = map(lambda x: unescape(x).replace('\xa0', ' ') if isinstance(x, str) else x, ele)
# 去除元素间换行符并替换空格
ele = (unescape(x).replace('\xa0', ' ') if isinstance(x, str) else x for x in ele if x != '\n')
return [SessionElement(e, page) if isinstance(e, _Element) else e for e in ele]
except XPathEvalError:

View File

@ -409,10 +409,12 @@ class SessionPage(object):
r = self.session.get(url, **kwargs)
elif mode == 'post':
r = self.session.post(url, data=data, **kwargs)
except Exception as e:
if show_errmsg:
raise e
return None, e
else:
headers = dict(r.headers)
content_type = tuple(x for x in headers if x.lower() == 'content-type')

File diff suppressed because it is too large Load Diff