[網絡爬蟲] 動態網頁抓取 — Selenium 元素定位

🌟想系統化學習爬蟲技術?看看這個:[數據抓取] 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)

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/bicheng/72956.shtml
繁體地址,請注明出處:http://hk.pswp.cn/bicheng/72956.shtml
英文地址,請注明出處:http://en.pswp.cn/bicheng/72956.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

ArcGIS操作:15 計算點的經緯度,并添加到屬性表

注意&#xff1a;需要轉化為地理坐標系 1、打開屬性表&#xff0c;添加字段 2、計算字段&#xff08;以計算緯度為例 !Shape!.centroid.Y ) 3、效果

[項目]基于FreeRTOS的STM32四軸飛行器: 七.遙控器按鍵

基于FreeRTOS的STM32四軸飛行器: 七.遙控器 一.遙控器按鍵搖桿功能說明二.搖桿和按鍵的配置三.按鍵掃描 一.遙控器按鍵搖桿功能說明 兩個手柄四個ADC。 左側手柄&#xff1a; 前后推為飛控油門&#xff0c;左右推為控制飛機偏航角。 右側手柄&#xff1a; 控制飛機飛行方向&a…

Redis 內存淘汰策略深度解析

Redis 作為高性能的內存數據庫&#xff0c;其內存資源的高效管理直接關系到系統的穩定性和性能。當 Redis 的內存使用達到配置的最大值&#xff08;maxmemory&#xff09;時&#xff0c;新的寫入操作將觸發內存淘汰機制&#xff08;Eviction Policy&#xff09;&#xff0c;以釋…

【面試】Java 集合

集合 1、常見的集合有哪些2、說說 List、Set、Queue、Map 四者的區別3、Collection 和 Collections 有什么區別4、Comparable 和 Comparator 的區別5、ArrayList 和 LinkedList 的區別是什么6、ArrayList 和 Vector 的區別是什么7、ArrayList 和 Vector 的擴容機制8、CopyOnWri…

【c++】平移字符串

說明 實現字符串的左移與右移 示例代碼 #include <iostream> #include <string> using namespace std;int main() {string str1 "12345";//左移2位string str2 str1.substr(2) str1.substr(0, 2);cout << str2 << endl;//右移2位&…

密碼學(終極版)

加密 & 解密 備注&#xff1a;密碼學領域不存在完全不能破解的密碼&#xff0c;但是如果一個密碼需要很久很久&#xff0c;例如一萬年才能破解&#xff0c;就認為這個密碼是安全的了。 對稱加密 非對稱加密 公鑰加密、私鑰解密 私鑰簽名、公鑰認證 非對稱的底層原理是…

FreeRTOS任務狀態查詢

一.任務相關API vTaskList&#xff08;&#xff09;&#xff0c;創建一個表格描述每個任務的詳細信息 char biaoge[1000]; //定義一個緩存 vTaskList(biaoge); //將表格存到這緩存中 printf("%s /r/n",biaoge); 1.uxTaskPriorityGet&#xff08;&#xf…

yolov5代碼詳解--3.python代碼腳本

三、val.py val.py的主要作用是對訓練好的模型進行驗證&#xff08;或評估&#xff09;。具體來說&#xff0c;它用于在指定的驗證集上評估模型的性能&#xff0c;計算各項評估指標&#xff0c;并輸出結果。val.py通常在模型訓練完成后運行&#xff0c;用于驗證模型的檢測精度、…

無人機應用探索:玻纖增強復合材料的疲勞性能研究

隨著無人機技術的快速發展&#xff0c;輕量化已成為其結構設計的核心需求。玻纖增強復合材料憑借高強度、低密度和優異的耐環境性能&#xff0c;成為無人機機身、旋翼支架等關鍵部件的理想選擇。然而&#xff0c;無人機在服役過程中需應對復雜多變的環境&#xff1a;高空飛行時…

Python SQLite3 保姆級教程:從零開始學數據庫操作

Python SQLite3 保姆級教程&#xff1a;從零開始學數據庫操作 本文適合純新手&#xff01;無需任何數據庫基礎&#xff0c;跟著步驟操作即可掌握 SQLite3 的核心用法。 目標&#xff1a;讓你像用記事本一樣輕松操作數據庫&#xff01; 目錄 什么是 SQLite3&#xff1f;環境準…

C語言中的整數類型(short,int,long和long long)

整數是編程中最常見的一種數據類型&#xff0c;C語言提供了多種整數類型&#xff0c;包括 short、int、long 和 long long&#xff0c;它們的主要區別在于存儲范圍和內存占用的大小。 本節將詳細講解這些整數類型的定義、特性、使用場景以及注意事項&#xff0c;幫助你全面理解…

使用jcodec庫,訪問網絡視頻提取封面圖片上傳至oss

注釋部分為FFmpeg&#xff08;確實方便但依賴太大&#xff0c;不想用&#xff09; package com.zuodou.upload;import com.aliyun.oss.OSS; import com.aliyun.oss.model.ObjectMetadata; import com.aliyun.oss.model.PutObjectRequest; import com.zuodou.oss.OssProperties;…

游戲引擎學習第147天

倉庫:https://gitee.com/mrxiao_com/2d_game_3 上一集回顧 具體來說&#xff0c;我們通過隱式計算來解決問題&#xff0c;而不是像數字微分分析器那樣逐步增加數據。我們已經涵蓋了這個部分&#xff0c;并計劃繼續處理音量問題。不過&#xff0c;實際上我們現在不需要繼續處理…

使用Dockerfile打包java項目生成鏡像部署到Linux_java項目打docker鏡像的dockerfile

比起容器、鏡像來說&#xff0c;Dockerfile 非常普通&#xff0c;它就是一個純文本&#xff0c;里面記錄了一系列的構建指令&#xff0c;比如選擇基礎鏡像、拷貝文件、運行腳本等等&#xff0c;每個指令都會生成一個 Layer&#xff0c;而 Docker 順序執行這個文件里的所有步驟&…

Linux -- 磁盤結構、文件系統ext2

一、磁盤 1.磁盤的物理結構 2.磁盤的存儲結構 盤片&#xff1a;是機械硬盤存儲數據的主要介質&#xff0c;一般由鋁合金或玻璃等材料制成&#xff0c;表面涂有一層磁性材料。數據通過磁頭在盤片的磁性涂層上進行磁化來記錄&#xff0c;磁化的不同方向代表二進制的 0 和 1。盤面…

標量、向量、矩陣與張量:從維度理解數據結構的層次

在數學和計算機科學中,維度描述了數據結構的復雜性,而標量、向量、矩陣、張量則是不同維度的數據表示形式。它們的關系可以理解為從簡單到復雜的擴展,以下是詳細解析: 1. 標量(Scalar):0維數據 定義:單個數值,沒有方向,只有大小。 維度:0維(無索引)。 示例: 溫度…

點云數據處理--splat轉3dtiles

文章目錄 處理流程簡介核心功能實現數據讀取與格式轉換定義Point類數據讀取splat轉gltf 點云數據分割定義四叉樹遞歸生成3dtiles瓦片 生成tileset.json遞歸生成tileset.json計算box 主函數調用渲染 下一步工作性能優化渲染效果調優其他 源碼地址&#xff1a; github 處理流程簡…

OneM2M:全球性的物聯網標準-可應用于物聯網中

OneM2M 是一個全球性的物聯網(IoT)標準,旨在為物聯網設備和服務提供統一的框架和接口,以實現設備之間的互操作性、數據共享和服務集成。OneM2M 由多個國際標準化組織(如 ETSI、TIA、TTC、ARIB 等)共同制定,目標是解決物聯網領域的碎片化問題,提供一個通用的標準,支持跨…

【Python 入門基礎】—— 人工智能“超級引擎”,AI界的“瑞士軍刀”,

歡迎來到ZyyOvO的博客?&#xff0c;一個關于探索技術的角落&#xff0c;記錄學習的點滴&#x1f4d6;&#xff0c;分享實用的技巧&#x1f6e0;?&#xff0c;偶爾還有一些奇思妙想&#x1f4a1; 本文由ZyyOvO原創??&#xff0c;感謝支持??&#xff01;請尊重原創&#x1…

Java爬蟲獲取淘寶商品詳情數據的完整指南

在電商領域&#xff0c;獲取商品詳情數據對于市場分析、價格監控、用戶體驗優化等場景具有重要意義。淘寶作為國內領先的電商平臺&#xff0c;提供了豐富的API接口供開發者使用&#xff0c;其中item_get和item_get_pro接口可以用來獲取商品的詳細信息。本文將詳細介紹如何使用J…