diff --git a/DrissionPage/common.py b/DrissionPage/common.py index aa82393..6ccaa92 100644 --- a/DrissionPage/common.py +++ b/DrissionPage/common.py @@ -51,7 +51,7 @@ def get_ele_txt(e) -> str: str_list.append(el) else: - if sub('[ \n\t]', '', el) != '': # 字符除了回车和空格还有其它内容 + if sub('[ \n\t\r]', '', el) != '': # 字符除了回车和空格还有其它内容 txt = el if not pre: txt = txt.replace('\n', ' ').strip(' ') diff --git a/DrissionPage/configs.ini b/DrissionPage/configs.ini index d910f03..d45bdab 100644 --- a/DrissionPage/configs.ini +++ b/DrissionPage/configs.ini @@ -1,10 +1,10 @@ [paths] -chromedriver_path = chromedriver75.exe +chromedriver_path = tmp_path = D:\python\projects\DrissionPage\DrissionPage\tmp [chrome_options] -debugger_address = 127.0.0.1:9222 -binary_location = D:\python\Google Chrome\Chrome\chrome.exe +debugger_address = +binary_location = arguments = ['--no-sandbox', '--disable-gpu', '--ignore-certificate-errors', '--disable-infobars'] extensions = [] experimental_options = {'prefs': {'profile.default_content_settings.popups': 0, 'profile.default_content_setting_values': {'notifications': 2}, 'plugins.plugins_list': [{'enabled': False, 'name': 'Chrome PDF Viewer'}]}, 'useAutomationExtension': False, 'excludeSwitches': ['enable-automation']} diff --git a/docs/使用方法/.keep b/docs/使用方法/.keep deleted file mode 100644 index e69de29..0000000 diff --git a/docs/使用方法/获取元素属性.md b/docs/使用方法/获取元素属性.md index 015b149..978d232 100644 --- a/docs/使用方法/获取元素属性.md +++ b/docs/使用方法/获取元素属性.md @@ -1,3 +1,5 @@ +# 获取元素信息 + ```python element.html # 返回元素 outerHTML element.inner_html # 返回元素 innerHTML diff --git a/docs/使用方法/获取页面元素.md b/docs/使用方法/获取页面元素.md index b210abc..8242d1d 100644 --- a/docs/使用方法/获取页面元素.md +++ b/docs/使用方法/获取页面元素.md @@ -9,6 +9,30 @@ shadow-root 的 shadow_root 属性。获取到的元素可继续用这些方法 d 模式获取元素的方法内置了等待,默认使用元素所属页面的超时设置,也可用在每次获取元素时单独设置等待时间。 +简单示例: + +```python +from DrissionPage import MixPage + +page = MixPage('s') +page.get('https://gitee.com/explore') + +ul_ele = page.ele('tag:ul@@text():全部推荐项目') # 获取包含“全部推荐项目”文本的 ul 元素 +titles = ul_ele.eles('tag:a') # 获取该 ul 元素下所有 a 元素 + +for i in titles: # 遍历列表,打印每个 a 元素的文本 + print(i.text) + +"""输出: +全部推荐项目 +前沿技术 +智能硬件 +IOT/物联网/边缘计算 +车载应用 +以下省略…… +""" +``` + # 方法和属性 ## ele() @@ -16,14 +40,19 @@ d 模式获取元素的方法内置了等待,默认使用元素所属页面的 此方法用于查找并返回第一个匹配的元素,d 模式下返回 DriverElement,s 模式下返回 SessionElement,用 xpath 获取元素属性时,直接返回属性文本。查找不到结果则返回 None。 ```python -ele = page.ele('search text') # 在页面下查找元素 -ele2 = ele1.ele('search text') # 在元素下查找后代元素 +ele1 = page.ele('search text') # 在页面内查找元素 +ele2 = ele1.ele('search text') # 在元素内查找后代元素 ``` ## eles() 此方法与 ele() 相似,但返回的是匹配到的所有元素组成的列表,用 xpath 获取元素属性时,返回属性文本组成的列表。 +```python +p_eles = ele.eles('tag:p') # 获取 ele 元素内的所有 p 元素 +p1 = p_eles[0] # 获取第一个 p 元素 +``` + ## s_ele() 此方法用于在一个元素下查找后代元素,以 SessionElement 形式返回结果(xpath 获取属性值时依然是返回 str),也可以直接将一个元素转换为 SessionElement 版本。 @@ -46,32 +75,47 @@ ele = page.s_ele('search text') # 在页面下查找元素,并以 SessionElem 此属性返回当前元素的后一个兄弟元素。 +```python +ele2 = ele1.next # 获取 ele1 后面一个兄弟元素 +``` + ## prev 此属性返回当前元素的前一个兄弟元素。 +```python +ele2 = ele1.prev # 获取 ele1 前面一个兄弟元素 +``` + ## parent 此属性返回当前元素的父元素。 +```python +ele2 = ele1.parent # 获取 ele1 的父元素 +``` + ## nexts() 此方法返回当前元素后面第若干个兄弟元素。 +```python +ele2 = ele1.nexts(3) # 获取 ele1 后面第三个兄弟元素 +``` + ## prevs() 此方法返回当前元素前面第若干个兄弟元素。 +```python +ele2 = ele1.prevs(3) # 获取 ele1 前面第三个兄弟元素 +``` + ## parents() 此方法返回当前元素第若干层祖先元素。 ```python -ele2 = ele1.next # 获取 ele1 后面一个兄弟元素 -ele2 = ele1.prev # 获取 ele1 前面一个兄弟元素 -ele2 = ele1.parent # 获取 ele1 的父元素 -ele2 = ele1.nexts(3) # 获取 ele1 后面第三个兄弟元素 -ele2 = ele1.prevs(3) # 获取 ele1 前面第三个兄弟元素 ele2 = ele1.parents(3) # 获取 ele1 上面 3 层父元素 ``` @@ -183,8 +227,12 @@ ele2 = ele1.ele('tag:div') # 定位 div 元素 ele2 = ele1.ele('tag:div@class=cls') # 定位 class 属性为 cls 的 div 元素 ele2 = ele1.ele('tag:div@text()=text') # 定位文本为 text 的 div 元素 ele2 = ele1.ele('tag:div@@class=cls@@text()=text') # 定位 class 属性为 cls 且文本为 text 的 div 元素 +ele2 = ele1.ele('tag:div@text():text') # 查找直接文本节点包含 text 字符串的 div 元素 +ele2 = ele1.ele('tag:div@@text():text') # 查找内部文本节点包含 text 字符串的 div 元素 ``` +**Tips:** 注意, `'tag:div@text():text'` 和 `'tag:div@@text():text'` 是有区别的,前者只在 div 的直接文本节点搜索,后者搜索 div 的整个内部。 + ## css 表示用 css selector 方式查找元素。css: 与 css= 效果一致。 @@ -196,15 +244,21 @@ ele2 = ele1.ele('css:>div') # 查找 div 子元素元素,这个写法是本 ## xpath -表示用 xpath 方式查找元素。xpath: 与 xpath= 效果一致。 +表示用 xpath 方式查找元素。xpath: 与 xpath= 效果一致。 +该方法支持完整的 xpath 语法,能使用 xpath 直接获取元素属性,selenium 不支持这种用法。 ```python ele2 = ele1.ele('xpath:.//div') # 查找 div 元素 ele2 = ele1.ele('xpath://div') # 和上面一行一样,查找元素的后代时,// 前面的 . 可以省略 +txt = ele1.ele('xpath://div/@class') # 获取 div 元素的 class 属性,返回字符串 ``` +**Tips:** 查找元素的后代时,// 前面的 . 可以省略。 + ## selenium 的 loc 元组 +查找方法能直接接收 selenium 原生定位元组进行查找,s 模式下也支持这种写法。 + ```python loc1 = By.ID, 'ele_id' loc2 = By.XPATH, '//div[@class="ele_class"]'