Python爬虫入门 ~ selenium元素定位

223 阅读2分钟

开启掘金成长之旅!这是我参与「掘金日新计划 · 12 月更文挑战」的第24天,点击查看活动详情

元素定位

自动化其中一个重要的点就是模拟鼠标和键盘来操作页面的元素,点击、输入等等。想要操作元素,前提是要找到它们,在WebDriver中,提供来很多定位元素的方法:

  • By.ID
  • By.NAME
  • By.CLASS_NAME
  • By.TAG_NAME
  • By.LINK_TEXT
  • By.PARTIAL_LINK_TEXT
  • By.CSS_SELECTOR
  • By.XPATH

案例演示

前置准备

这里以百度的首页为例,我们来获取以下它页面中的元素。

# 引入相关的库
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from selenium.webdriver.common.by import By

# 防止浏览器闪退
options = webdriver.ChromeOptions()
options.add_experimental_option('detach', True)
options.add_experimental_option('excludeSwitches', ['enable-automation'])

# 引入驱动,构建浏览器对象
path = 'chromedriver.exe'
browser = webdriver.Chrome(service=Service(path), options=options)

# 访问
url = 'https://www.baidu.com/'
browser.get(url)

By.ID

通过属性id定位元素,使用find_element()函数,通过指定所需要查找的类型By.ID,输入要查找的id属性值。

image.png

obj = browser.find_element(By.ID, 'su')
print(obj)
print(obj.accessible_name)

image.png

By.NAME

通过属性name定位元素

image.png

# 通过属性`name`定位元素
obj = browser.find_element(By.NAME, 'wd')
print(obj)

image.png

By.CLASS_NAME

通过属性class name定位元素

image.png

# 通过属性`class name`定位元素
obj = browser.find_element(By.CLASS_NAME, 's_ipt')
print(obj)

image.png

By.TAG_NAME

通过标签名称定位元素。除了find_element函数之外,还有一个find_elements函数,两者的区别是一个只找第一个匹配的,一个是找到所有匹配的,其返回结果是一个列表。

# 通过属性`class name`定位元素
obj = browser.find_element(By.TAG_NAME, 'input')
print(obj)
obj = browser.find_elements(By.TAG_NAME, 'input')
print(obj)

image.png

By.LINK_TEXT

通过链接文本定位元素,查找页面中的a标签,查找到文本匹配的节点。

image.png

# 通过链接文本定位元素
obj = browser.find_element(By.LINK_TEXT, '图片')
print(obj)

image.png

By.PARTIAL_LINK_TEXT

通过部分链接文本定位元素,使用的是模糊搜索,只要包含有关键字的即可。而LINK_TEXT则需要全部匹配上才会命中。

image.png

# 通过链接文本定位元素
obj = browser.find_elements(By.PARTIAL_LINK_TEXT, '图')
print(obj)

image.png

By.CSS_SELECTOR

通过css选择器定位元素,使用的是bs4的语法。

# 通过链接文本定位元素
obj = browser.find_elements(By.CSS_SELECTOR, '#su')
print(obj)

image.png

By.XPATH

通过相对/绝对路径定位元素,使用的是xpath的语法。

# 通过相对/绝对路径定位元素,使用的是`xpath`的语法
obj = browser.find_elements(By.XPATH, '//input[@id="su"]')
print(obj)

image.png