关于怎么安装使用Selenium,看这篇文章: Python Selenium使用举例
Selenium用法 主要就4步:
- 1.创建WebDriver对象;
- 2.用WebDriver对象的get方法打开网址;
- 3.用WebDriver对象的find_element方法去找到网页上你需要的元素,返回WebElement对象(找到对象是重点);
- 4.对WebElement对象进行操作,一般就是获取对象的内容、填写入内容或者click操作。
这篇文章主要针对第3步,列举一些查找元素的方法。(文章代码中使用selenium4版本)
在浏览器中查找网页元素,直接按F12,打开开发者模式,在【元素】(Elements)选项中就可以查看网页源码。
查找网页元素时,有两个情况:
- webdriver.find_element:只查找1个元素(返回WebElement对象);
- webdriver.find_elements:查找多个元素(返回一个List的WebElement对象)
一、只查找一个元素(find_element方法)
1.简单的直接查找
- By.ID:通过HTML标签的id属性(id属性在HTML文档中具体唯一性,所以有id优先通过这个查找)
- By.CLASS_NAME:通过HTML标签的class属性(class属性并没有唯一性,如果有多个元素的话,只会返回第1个;当然有些class在站点中唯一的话,也是可以用来查找的)
- By.TAG_NAME:通过HTML标签(多个元素的话,也是返回第1个)
对应代码为:
1 | from selenium.webdriver.common.by import By |
在F12打开的开发者工具中,按 Ctrl+F
键,打开搜索。
如果是id,搜索id名前面加上#
号,直接就能搜索id。如图所示:
可以用 WebElement.send_keys('搜索内容')
测试是否找到了这个元素,或者直接print一下。
如果找不到元素,或者有这个元素、网站响应速度比代码执行速度慢点,find_element 方法就会抛出 selenium.common.exceptions.NoSuchElementException 异常。
2.处理 NoSuchElementException 的异常
因为有2种情况,都会有有这个异常:
- 情况一:找不到此元素
- 情况二:代码执行速度比网站响应快
1).如果是第二种情况
虽然用了 wd.implicitly_wait(10)
,但有时候还是会有这个问题。
我一般这样处理这个异常,get方法之后sleep一下(时间不是固定,看网络和站点的响应情况),然后如果报这个异常,就再sleep多等待一下再查找这个元素。
1 | wd.get(site_url) |
2).如果是第一种情况
就直接在语句后面加个 if(element)的判断好了,看看false的时候(没找到元素)需要做什么处理或者提示。
3.通过CSS_SELECTOR 复杂一点的查找(全能查找)
By.CSS_SELECTOR就比较全能了,用这个也可以根据ID、CLASS_NAME来查找的。
1).普通查找
- (By.CSS_SELECTOR,’#sb_form_q’):# 根据id查找,= (By.ID, ‘sb_form_q’)
- (By.CSS_SELECTOR,’.sb_form_q’):# 根据class name查找,=(By.CLASS_NAME, ‘sb_form_q’)
2).子元素、后代元素查找(这个经常会用到)
比如有如下一段html代码:
1 | <div class='container'> |
我要查找“内层33”这个内容,那我们可以这样找:
(By.CSS_SELECTOR, '.container > .layer1 > .inner33')
:# 如果用大于号,表示子元素,必须一层一层,中间不能少个(By.CSS_SELECTOR, '.container .layer1 .inner33')
: # 如果没用大于号,表示后代元素(By.CSS_SELECTOR, '.container .inner33')
: # 后代元素中间每一层就不是必须了
3).根据属性查找(这个也常用)
(By.CSS_SELECTOR,'div[class="inner44"]')
:# 查找tag是div,且class属性是inner44的(By.CSS_SELECTOR,'button[type=submit]')
:# 查找tag是button且type属性是submit的-
(By.CSS_SELECTOR,'[href="www.test.com"]')
:# 查找对应的href属性值 (By.CSS_SELECTOR,'div[class="inner44"][ctype="test"]')
:# 查找tag是div,且class属性是inner44、ctype属性是test的(可以多个属性)(By.CSS_SELECTOR,'a[href*="http"]')
:# 还可以用正则,查找a标签href属性包含http的(By.CSS_SELECTOR,'a[href^="http"]')
:# 查找a标签href属性以http开头的(By.CSS_SELECTOR,'a[href$=".cn"]')
:# 查找a标签href属性以.cn结尾的
用的最多的感觉除了偶尔能用直接查找外,就是后代元素(多个class_name定位)和根据属性查找。
4.Xpath选择器(全能查找)
用css查找基本上很方便、强大了,只是有些场景用 css 查找元素会比较麻烦,而xpath比较方便。
另外 Xpath 还有其他领域会使用到,比如爬虫框架 Scrapy,手机App框架 Appium。
用Xpath的时候,代码就用By.XPATH,类似这样: wd.find_element(By.XPATH,'/html/body/div')
等回头研究用爬虫的时候,用的例子多一些,再单独写一篇。此篇略。
二、查找多个元素(find_elements方法)
比如有时候一个class_name会有很多地方在用 ,就可以查多个元素。
find_elements方法返回是一个List的列表,所以用for循环一下就能得到每一个。
1 | elements = wd.find_elements(By.CLASS_NAME, 'sb_form_q') |
所以CSS_SELECTOR中还有子节点的写法,我一般也不用,直接find_elements后,取列表中第几个。
find_element 和 find_elements 的区别
- find_elements:找出符合条件的所有元素, 如果没有,返回空列表
- find_element:找出符合条件的第一个元素,如果没有,抛出NoSuchElementException 异常
- 本文标题:Python Selenium查找元素方法汇总
- 本文作者:HDUZN
- 创建时间:2022-05-04 16:26:27
- 本文链接:http://hduzn.cn/2022/05/04/Python-Selenium查找元素方法汇总/
- 版权声明:本博客所有文章除特别声明外,均采用 BY-NC-SA 许可协议。转载请注明出处!