Selenium xpath无法解析的如何处理
一、问题描述
-
Xpath无法解析的原因
-
使用selenium加载时没有加入等待时间,导致页面元素无法加载xpath无法解析
-
xpath语句未能准确定位
-
如果xpath无法解析到怎么办
-
xpath点击失效(报错:该元素不是可点击元素)(客户端渲染,需要研究分析js代码实现同等效果的操作;或者通过火狐浏览器对js代码点击事件进行研究)
-
二、解决办法
1
<1> 用time.sleep(3)方法休眠等待
<2> 用显示等待或隐式等待
2
<1> 使用google插件XpathHelper定位
<2> 在Chrome浏览器中按F12打开调试模式,在Elements页面按Ctrl + F进行搜索定位
3
-
情景一:页面不规则
<1> 待页面加载完毕后,通过driver.page_source方法获取页面源码,通过正则匹配进行定位抓取
-
情景二:页面规则
<1> 复制chrome full xpath 绝对定位
<2> 通过部分唯一标签或者元素部分绝对定位(元素唯一的情况下)
<3> 用过js进行元素获取
4
<1> 用过js进行元素获取
<2> 通过键盘的Enter\上下左右\Tab按钮属性等其他按键操作定位
| 键值 | 解释 |
|---|---|
| send_keys(Keys.BACK_SPACE) | 删除键BackSpace |
| send_keys(Keys.SPACE) | 空格键Space |
| send_keys(Keys.TAB) | 制表键Tab |
| send_keys(Keys.ESPACE) | 回退键Esc |
| send_keys(Keys.ENTER) | 回车键Enter |
| send_keys(Keys.CONTROL,‘a’) | 全选Ctrl+A |
| send_keys(Keys.CONTROL,‘c’) | 复制CTRL+C |
| send_keys(Keys.CONTROL,‘x’) | 剪切CTRL+X |
| send_keys(Keys.CONTROL,‘v’) | 粘贴Ctrl+V |
| send_keys(Keys.F1) | 键盘F1 |
| send_keys(Keys.F12) | 键盘F12 |
三、高级Xpath用法(扩展延伸)
1、 模糊查询
- //ul/li[text()="经验教程"] --全文字匹配
- self.driver.find_element_by_link_text()
- xpath('//div[contains(@class,"a")]') #它会取得所有class为a的元素
- xpath('//div[contains(@class,"a") and contains(@class,"b")]') #它会取class同时有a和b的元素
- //a[contains(text(), "搜索")] --模糊文字匹配
- //li[contains,(.,'单次预约')]
- //div[contains(@class, 'demo')] 【特殊元素标签模糊匹配用法】
- //div[contains(@class, 'demo') and contains(@class, 'other')] 【多个元素的组合模糊定位】
2、常用解析
-
解析文字:post_time = selector.xpath('//div[@class="video-data"]/span/text()')
-
解析结果:['295播放\xa0·\xa0', '0弹幕', '2020-12-05 09:00:01']
-
普通解析
extract() 返回一个包含有字符串的列表,配合[0]使用
extract_first() 返回列表中的第一个字符串,列表为空没有返回None
get() 提取列表中第1个文本内容(等同于extract_first())