selenium XPath定位的實(shí)現(xiàn)示例
一、XPATH概念
XPath是一種用于在 XML 文檔中定位和選擇節(jié)點(diǎn)的語(yǔ)言。它是一種在 XML 文檔中導(dǎo)航和查詢數(shù)據(jù)的標(biāo)準(zhǔn)方式,通常用于從 XML 文檔中提取特定信息或執(zhí)行數(shù)據(jù)操作。XPath 使用路徑表達(dá)式來(lái)遍歷 XML 樹(shù),并且支持多種功能,如節(jié)點(diǎn)選取、字符串匹配、數(shù)值計(jì)算、邏輯運(yùn)算等,可以幫助用戶準(zhǔn)確定位到文檔中所需的節(jié)點(diǎn)或內(nèi)容。XPath 的語(yǔ)法類似于文件系統(tǒng)路徑,通過(guò)使用斜杠(/)、雙斜杠(//)、方括號(hào)([])等符號(hào)來(lái)描述節(jié)點(diǎn)之間的層次關(guān)系和屬性條件,從而實(shí)現(xiàn)對(duì) XML 結(jié)構(gòu)的靈活查詢和篩選。XPath 在 XML 數(shù)據(jù)處理、Web 抓取、XSLT 轉(zhuǎn)換等領(lǐng)域廣泛應(yīng)用,為處理和操作 XML 數(shù)據(jù)提供了強(qiáng)大的工具和方法。
二、常用規(guī)則與方法
我們現(xiàn)用表格列舉一下幾個(gè)常用規(guī)則:
方法 | 概念 |
---|---|
/ | 從當(dāng)前節(jié)點(diǎn)選取直接子節(jié)點(diǎn) |
/ / | 從當(dāng)前節(jié)點(diǎn)選取子孫節(jié)點(diǎn) |
. | 選取當(dāng)前節(jié)點(diǎn) |
… | 選取當(dāng)前節(jié)點(diǎn)的父節(jié)點(diǎn) |
1.f12例子:
<div> <ul> <li class="item-0"> <a rel="external nofollow" >第一項(xiàng)</a> </li> <li class="item-1"> <a rel="external nofollow" >第二項(xiàng)</a> </li> <li class="item-inactive"> <a rel="external nofollow" >第三項(xiàng)</a> </li> <li class="item-1"> <a rel="external nofollow" >第四項(xiàng)</a> </li> </ul> </div>
2.節(jié)點(diǎn)獲取文本
獲取first item文本
- 通過(guò)連續(xù)的 / 或 // 可以查找子節(jié)點(diǎn)或子孫節(jié)點(diǎn)
- 我們選取了
第一個(gè)li
節(jié)點(diǎn),中括號(hào)中傳入數(shù)字1即可,注意這里和代碼中不同,序號(hào)是以 1 開(kāi)頭的,不是 0 開(kāi)頭的。 - 如果我們要選取
最后一個(gè) li
節(jié)點(diǎn),中括號(hào)中傳入last()
即可,返回的便是最后一個(gè) li 節(jié)點(diǎn) - 最后使用
/text()
或者在括號(hào)外面.text
獲取節(jié)點(diǎn)內(nèi)部文本
dr.find_element(By.XPATH,'//div/ul/li[1]/a/text()') dr.find_element(By.XPATH,'//div/ul/li[1]/a').text
3.屬性匹配
在選取的時(shí)候我們還可以用 @ 符號(hào)進(jìn)行屬性過(guò)濾,比如在這里如果我們要選取 class 為 item-0 的 li 節(jié)點(diǎn),可以這樣實(shí)現(xiàn):
dr.find_element(By.XPATH,'//li/a[@class="item-0"]')
在這里我們通過(guò)加入 [@class=“item-0”] 就限制了節(jié)點(diǎn)的 class 屬性為 item-0,文本中符合條件的 li 節(jié)點(diǎn)有一個(gè),所以返回結(jié)果應(yīng)該返回匹配到的元素,結(jié)果如下:
第一項(xiàng)
4. 屬性獲取
我們知道了用 text() 可以獲取節(jié)點(diǎn)內(nèi)部文本,那么節(jié)點(diǎn)屬性該怎樣獲取呢?其實(shí)還是用 @ 符號(hào)就可以,例如我們想獲取所有 li 節(jié)點(diǎn)下所有 a 節(jié)點(diǎn)的 href 屬性,代碼如下:
dr.find_element(By.XPATH,'//li/a/@href')
在這里我們通過(guò) @href 即可獲取節(jié)點(diǎn)的 href 屬性
我們還能使用selenium里dr.find_elements方法,用for循環(huán)取便歷所有的"//li/a",用.get_attribute(‘href’),將所有的href屬性全部獲取,代碼如下:
a=dr.find_elements(By.XPATH,'//li/a') for href in a: print(href.get_attribute('href'))
5.iframe標(biāo)簽處理
當(dāng)有frame標(biāo)簽時(shí)需要使用他的id來(lái)進(jìn)行切換,要不然不能取到frame標(biāo)簽下的內(nèi)容
語(yǔ)法:
switch_to.frame(“frame_id”)
例子:
<body> <iframe src = "a.html" id = "frame_id" name = "myframe"> </iframe> </body>
如何定位到iframe呢:
from selenium import webdriver driver = webdriver.Chrome() #用frame的index來(lái)定位,第一位時(shí)0 driver.switch_to.frame(0)
三、同級(jí)節(jié)點(diǎn)元素定位
【同級(jí)元素】:
- 向下尋找 following-sibling::
- 向上尋找 preceding::
通過(guò)li[2]QQ登錄使用following-sibling::找微博登錄:
dr.find_element(By.XPATH,'//div[@class='_3x8w3YCi']/ul/li[2]/following-sibling::li[1]')
- 通過(guò)li[2]QQ登錄使用preceding-sibling::找微信登錄:
dr.find_element(By.XPATH,'//div[@class='_3x8w3YCi']/ul/li[2]/preceding-sibling::li[1]')
四、關(guān)鍵字定位
根據(jù)文本找位置
dr.find_element(By.XPATH,'//li/a[text()="第一項(xiàng)"]')
五、定位父級(jí)元素
【父級(jí)元素】
/parent::
如下面的xpath,定位ul下的li包含"處理"的文本,然后再定位該li的父級(jí)元素
完整代碼:
dr.find_element(By.XPATH,'ul/li/parpent::*')
到此這篇關(guān)于selenium XPath定位的實(shí)現(xiàn)示例的文章就介紹到這了,更多相關(guān)selenium XPath定位內(nèi)容請(qǐng)搜索腳本之家以前的文章或繼續(xù)瀏覽下面的相關(guān)文章希望大家以后多多支持腳本之家!
相關(guān)文章
Django實(shí)現(xiàn)celery定時(shí)任務(wù)過(guò)程解析
這篇文章主要介紹了Django實(shí)現(xiàn)celery定時(shí)任務(wù)過(guò)程解析,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友可以參考下2020-04-04基于Python實(shí)現(xiàn)簡(jiǎn)單的學(xué)生點(diǎn)名系統(tǒng)
現(xiàn)在的學(xué)生大部分都很積極,會(huì)主動(dòng)舉手回答問(wèn)題。但是,也會(huì)遇到一些不好的情況,比如年級(jí)越高主動(dòng)舉手的人越少,所以本文做了一個(gè)隨機(jī)的學(xué)生點(diǎn)名系統(tǒng)可以幫老師解決這些問(wèn)題2022-09-09python基礎(chǔ)while循環(huán)及if判斷的實(shí)例講解
下面小編就為大家?guī)?lái)一篇python基礎(chǔ)while循環(huán)及if判斷的實(shí)例講解。小編覺(jué)得挺不錯(cuò)的,現(xiàn)在就分享給大家,也給大家做個(gè)參考。一起跟隨小編過(guò)來(lái)看看吧2017-08-08在python的類中動(dòng)態(tài)添加屬性與生成對(duì)象
這篇文章給大家介紹了如何在python的類中動(dòng)態(tài)添加屬性和生成對(duì)象,文中通過(guò)幾個(gè)方面來(lái)進(jìn)行介紹,對(duì)這感興趣的朋友們可以學(xué)習(xí)學(xué)習(xí)。2016-09-09解決python寫入帶有中文的字符到文件錯(cuò)誤的問(wèn)題
今天小編就為大家分享一篇解決python寫入帶有中文的字符到文件錯(cuò)誤的問(wèn)題,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-01-01Python.append()與Python.expand()用法詳解
今天小編就為大家分享一篇Python.append()與Python.expand()用法詳解,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2019-12-12Python matplotlib生成圖片背景透明的示例代碼
這篇文章主要介紹了Python matplotlib生成圖片背景透明的示例代碼,文中通過(guò)示例代碼介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或者工作具有一定的參考學(xué)習(xí)價(jià)值,需要的朋友們下面隨著小編來(lái)一起學(xué)習(xí)學(xué)習(xí)吧2019-08-08在keras下實(shí)現(xiàn)多個(gè)模型的融合方式
這篇文章主要介紹了在keras下實(shí)現(xiàn)多個(gè)模型的融合方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過(guò)來(lái)看看吧2020-05-05