Python Selenium查找元素方法汇总
HDUZN

关于怎么安装使用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
2
3
4
5
6
7
8
9
from selenium.webdriver.common.by import By
# 初始化代码 ...
wd = webdriver.Chrome(options=option)
wd.get('https://cn.bing.com/')
# ...

e1 = wd.find_element(By.ID, 'sb_form_q') # 搜索框
e2 = wd.find_element(By.CLASS_NAME, 'sb_form_q')
e3 = wd.find_element(By.TAG_NAME, 'input')

在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
2
3
4
5
6
7
wd.get(site_url)
time.sleep(2) # 等待2秒
try:
element = wd.find_element(By.ID,'search_icon')
except selenium.common.exceptions.NoSuchElementException:
time.sleep(5) # 等待5秒
element = wd.find_element(By.ID,'search_icon')

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
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<div class='container'>
<div class='layer1'>
<div class='inner11'>
<span>内层11</span>
</div>
<div class='inner12'>
<span>内层12</span>
</div>
</div>
</div>
<div class='container'>
<div class='layer1'>
<div class='inner33'>
<span>内层33</span>
</div>
<div class='inner44'>
<span>内层12</span>
</div>
</div>
</div>

我要查找“内层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
2
3
elements = wd.find_elements(By.CLASS_NAME, 'sb_form_q')
for element in elements:
print(element.text)

所以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 许可协议。转载请注明出处!
 评论