🌟想系統化學習爬蟲技術?看看這個:[數據抓取] Python 網絡爬蟲 - 學習手冊-CSDN博客
在使用 Selenium 時,往往需要先定位到指定元素,然后再執行相應的操作。例如,再向文本輸入框中輸入文字之前,我們需要先定位到文本框對應的元素 <input>
之后,再對該元素對應的對象執行輸入文本的操作。
0x01:WebDriver 類元素定位方法
Selenium 的 WebDriver 類中提供了多種定位元素的方法,這些方法有的可以定位單個元素,有的可以直接定位多個元素,WebDriver 類中定位單個元素的方法如下表所示:
方法 | 解析 |
---|---|
find_element() | 通過指定方式定位元素 |
find_element_by_id() | 通過 ID 屬性定位元素 |
find_element_by_name() | 通過 name 屬性定位元素 |
find_element_by_xpath() | 通過 XPath 的路徑表達式定位元素 |
find_element_by_link_text() | 通過鏈接文本定位元素 |
find_element_by_partial_link_text() | 通過部分鏈接文本定位元素 |
find_element_by_tag_name() | 通過標簽名定位元素 |
find_element_by_class_name() | 通過 class 屬性定位元素 |
find_element_by_css_selector() | 通過 CSS 選擇器定位元素 |
上面表中所有方法都會返回一個 WebElement
類的對象(通過 text
屬性可以打印文本內容),該對象用于描述網頁上的一個元素。需要注意的是,上面表中所有的方法只能定位第一次符合要求的元素。
如果你希望定位符合要求的所有元素,就需要使用定位多個元素的方法。定位多個元素的方法名稱與用法都與單個元素的定位名稱相似,僅需要將 element
設為復數形式 elements
即可。定位多個元素的方法返回值是包含所有符合元素的列表。
0x02:通過 id 屬性定位元素
在 HTML 中,id
屬性用于規定元素的唯一 ID 值。例如,百度搜索首頁,左上角的那些外鏈,就對應著 id 屬性值為 s-top-left
的標簽,通過這個 id 我們就可以精確定位這一片的內容:
在 Selenium 中,通過 find_element_by_id()
方法可以通過 id
屬性定位頁面元素,并返回對應的元素內容:
from selenium import webdriver
import time
?
driver = webdriver.Chrome() ? ? ? ? ?# 創建瀏覽器對象
driver.get("https://www.baidu.com") ?# 訪問百度首頁
?
# 通過 id 屬性定位元素
element = driver.find_element_by_id('s-top-left')
# 通過 text 屬性輸出元素的文本內容
print(element.text)
0x03:通過 class 屬性定位元素
在 HTML 中,class
屬性用于規定元素的一個或多個類名,大多數情況下用于指向樣式表中的類。我們繼續以百度首頁為例,如下,通過在 “開發者工具” 中輸入 .mnav
即可篩選出一堆 Class 屬性中含有 mnav
的標簽:
在 Selenium 中,通過 find_element_by_class_name()
方法我們可以通過 class
屬性定位元素,并返回匹配的元素,代碼如下:
from selenium import webdriver
?
driver = webdriver.Chrome() ? ? ? ? ?# 創建瀏覽器對象
driver.get("https://www.baidu.com") ?# 訪問百度首頁
?
# 通過 class 屬性定位所有屬性含有 mnav 的標簽
element_list = driver.find_elements_by_class_name('mnav')
?
# 打印 class 中含有 mnav 元素的內容
for element in element_list:print(element.text)
0x04:通過指定方法定位元素 — find_element()
Selenium 提供了一個通用的 find_element()
方法來定位元素(想要定位多個元素的話需要使用 find_elements()
)。與其它幾個方法相比,它有更加靈活的使用方式,我們可以通過指定參數,來選擇定位的方法。find_element()
聲明如下:
find_element(self, by=By.ID, value=None)
該方法接收兩個參數,參數 value
表示元素的名稱或者屬性的值,亦或者對應查詢方式的傳參。參數 by
支持的取值及其說明如下表所示:
取值 | 說明 |
---|---|
By.ID | 通過 id 屬性定位元素 |
By.NAME | 通過 name 屬性定位元素 |
By.CLASS_NAME | 通過 class 屬性定位元素 |
By.TAG_NAME | 通過標簽名定位元素 |
By.LINK_TEXT | 通過鏈接文本定位元素 |
By.PARTIAL_LINK_TEXT | 通過部分鏈接文本定位元素 |
By.CSS_SELECTOR | 通過 CSS 選擇器定位元素 |
By.XPATH | 通過 XPath 的路徑表達式定位元素 |
例如,使用 find_element()
方法定位百度搜索首頁中 class 屬性值包含 mnav 的第一個元素:
from selenium.webdriver.common.by import By # 導入 By 類
from selenium import webdriver
?
driver = webdriver.Chrome() ? ? ? ? ?# 創建瀏覽器對象
driver.get("https://www.baidu.com") ?# 訪問百度首頁
?
# 通過 class 屬性定位第一個屬性中含有 mnav 的標簽
element = driver.find_element(by=By.CLASS_NAME, value='mnav')
# element_list = driver.find_elements(by=By.CLASS_NAME, value='mnav') # 定位多個元素
?
print(element.text)
0x05:通過標簽名定位元素
這里所說的標簽就是指 HTML 標簽,比如超鏈接的 <a>
標簽,又比如常見的塊 <div>
。我們依舊以百度首頁為例,可以看到,百度首頁中包含很多超鏈接標簽:
假設我們要獲取當前頁面所有的 <a>
標簽,此時我們就可以通過 find_elements_by_tag_name()
函數實現:
from selenium import webdriver
?
driver = webdriver.Chrome() ? ? ? ? ?# 創建瀏覽器對象
driver.get("https://www.baidu.com") ?# 訪問百度首頁
?
# 獲取當前頁面中所有的 <a> 標簽
element_list = driver.find_elements_by_tag_name('a')
print(f"[ + ] 當前頁面共捕獲 <a> 標簽: {len(element_list)} 個")
?
# 打印每個標簽中的文本
for element in element_list:print(element.text)
0x06:通過鏈接文本定位元素
超鏈接即 <a>
標簽,超鏈接文本,即被 <a>
標簽包裹的內容。Selenium 提供了兩種方式,可以直接通過超鏈接文本定位元素,一種是完全匹配,即 <a>
標簽內部的內容要與預期內容完全相同才匹配成功;另一種是模糊匹配,比如你想匹配 “新” 字,那么包含 “新聞”,“新鮮” 等這類的標簽都會被選中:
from selenium import webdriver
?
driver = webdriver.Chrome() ? ? ? ? ?# 創建瀏覽器對象
driver.get("https://www.baidu.com") ?# 訪問百度首頁
?
# 通過鏈接文本定位元素
element = driver.find_element_by_link_text("新聞") # 完全匹配
print(element) # 打印元素
?
element = driver.find_elements_by_partial_link_text("新") # 模糊匹配,只要里面包含了 "新" 的標簽就會被匹配上
print(element)
0x07:通過 XPath 路徑表達式定位元素
XPath 即 XML 路徑查詢語言(XML Path Language),是一種用于確定 XML 文檔中部分節點位置的語言。它起初只支持搜索 XML 文檔,更新后能支持搜索 HTML 文檔。
關于 XPath 的語法,筆者在前面的章節中介紹過了(如果沒有,一定是筆者還沒發)。所以這里筆者就不詳細介紹它的語法了,直接上演示,假設我們要選中百度首頁的 “新聞”,通過 “XPATH 測試插件”,我們可以直接獲取其 XPath 定位語法:
//div[@id='s-top-left']/a[@class='mnav c-font-normal c-color-t'][1]
在 Selenium 中,我們可以通過 find_element_by_xpath()
來使用 XPath 語法定位元素:
from selenium import webdriver
?
driver = webdriver.Chrome() ? ? ? ? ?# 創建瀏覽器對象
driver.get("https://www.baidu.com") ?# 訪問百度首頁
?
# 通過 XPath 定位元素
element = driver.find_element_by_xpath("//div[@id='s-top-left']/a[@class='mnav c-font-normal c-color-t'][1]")
print(element.text)