python+selenium使用xpath定位的問題及解決
python用selenium調(diào)chrome爬取網(wǎng)頁信息遇到報(bào)錯(cuò)
1.InvalidSelectorException: Message: invalid selector: The result of the xpath expression is [object Attr]. It should be an element
原因是selenium不支持從xpath中直接獲取text文本信息。
name=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/h2/text()") website=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/a[3]/@href")
xpath表達(dá)式修改為:
name=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/h2/text()") website=web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/a[3]/@href")
2.Message: no such element: Unable to locate element:
xpath表達(dá)式一直無法準(zhǔn)確定位,原因是通過瀏覽器開發(fā)者工具copy的xpath表達(dá)式和實(shí)際selenium獲取的網(wǎng)頁資源不同,表達(dá)式錯(cuò)誤無法定位。(經(jīng)對(duì)比發(fā)現(xiàn)是selenium有一個(gè)需用戶同意的cookie彈窗)
通過print(web.page_source)拿到selenium獲取的網(wǎng)頁資源,發(fā)現(xiàn)有一個(gè)div未加載出來。
其實(shí)應(yīng)該是body下第2個(gè)div。
通過開發(fā)者工具重新獲得準(zhǔn)確的xpath表達(dá)式。
原xpath表達(dá)式:
title = web.find_element(By.XPATH,"/html/body/div[3]/div/div[2]/h2").text
改為正確的xpath表達(dá)式:
title = web.find_element(By.XPATH,"/html/body/div[2]/div/div[2]/h2").text
3.使用發(fā)現(xiàn)selenium效率過低,一個(gè)網(wǎng)頁全部加載完畢要1分鐘左右。
解決辦法是設(shè)置最長(zhǎng)加載時(shí)長(zhǎng),超過時(shí)長(zhǎng)則停止加載,開始定位數(shù)據(jù)。
from selenium.common.exceptions import TimeoutException
web = webdriver.Chrome()
web.set_page_load_timeout(10)#設(shè)置頁面加載時(shí)長(zhǎng)
web.set_script_timeout(10)#設(shè)置JS加載時(shí)長(zhǎng)
try:
web.get(str(url))
except TimeoutException: #加載超時(shí)異常處理
web.execute_script('window.stop()') python selenium xpath高級(jí)定位用法
目前很多網(wǎng)頁前端代碼是框架或 JS 生成的,就導(dǎo)致了混亂而難以定位。
為了快速而又復(fù)雜定位 Selenium 中有一個(gè) Xpath 選擇器,可以選擇復(fù)雜的頁面定位,也是爬蟲在網(wǎng)頁定位中的較優(yōu)的選擇。
1、通過絕對(duì)路徑定位元素
driver.find_element_by_xpath("html/body/div/form/input")2、通過相對(duì)路徑定位元素
driver.find_element_by_xpath("http://input")3、使用索引定位元素
driver.find_element_by_xpath("http://input[1]")4、使用XPATH的屬性值定位元素
driver.find_element_by_xpath("http://input[@id='username']")
driver.find_element_by_xpath("http://input[@type='submit'][@name='sub1']")
driver.find_element_by_xpath("http://input[@type='submit' and @name='sub1']")
driver.find_element_by_xpath("http://input[@type='submit' or @name='sub1']")5、使用XPATH的屬性名稱定位元素
# 查找所有input標(biāo)簽中含有type屬性的元素
driver.find_element_by_xpath("http://input[@type]")
# 查找所有a標(biāo)簽中含有onclick屬性的元素
driver.find_element_by_xpath("http://a[@onclick]")
.....6、使用任意值來匹配屬性及元素
# 匹配所有input元素中含有屬性的值為readonly的元素
driver.find_element_by_xpath("http://input[@*='readonly']"))7、使用模糊的屬性值匹配
starts-with():匹配一個(gè)屬性開始位置的關(guān)鍵字,是模糊定位的一種。
# 匹配id以submit開頭的元素,如:id='submit'
driver.find_element_by_xpath("http://input[start-with(@id,'submit')]")ends-with():匹配一個(gè)屬性結(jié)束位置的關(guān)鍵字,是模糊定位的一種。
# 匹配id以submit結(jié)尾的元素,如:id='submit'
driver.find_element_by_xpath("http://input[ends-with(@id,'submit')]")
contains():匹配一個(gè)屬性值中包含的字符串,也是模糊定位的一種。
# 匹配id中含有submit的元素,如:id='submit'
driver.find_element_by_xpath("http://input[contains(@id,'submit')]")
# 匹配name屬性中包含na關(guān)鍵字的頁面元素
driver.find_element_by_xpath("http://input[contains(@name,'na')]")
text():根據(jù)文本信息匹配元素位置。
# 如:<a rel="external nofollow" >百度搜索</a>
driver.find_element_by_xpath("http://a[text()='百度搜索'] ")
driver.find_element_by_xpath("http://a[contains(text(),"百度搜索")]")
last():函數(shù)位置定位。
# 表示div元素->form元素->input元素的最后一個(gè)子元素,得到id值為e2的E元素
driver.find_element_by_xpath("/div/form/input[last()]")8、過慮某個(gè)元素
name():獲取標(biāo)簽名稱。
# 表示過慮掉在 div id='query_reulst_box' 的下的 style 標(biāo)簽和 meta 標(biāo)簽
driver.find_element_by_xpath("http://div[@id='query_reulst_box']/*[not(name()='style' and name()='meta')]//text())總結(jié)
以上為個(gè)人經(jīng)驗(yàn),希望能給大家一個(gè)參考,也希望大家多多支持腳本之家。
相關(guān)文章
Python實(shí)現(xiàn)遺傳算法(二進(jìn)制編碼)求函數(shù)最優(yōu)值方式
今天小編就為大家分享一篇Python實(shí)現(xiàn)遺傳算法(二進(jìn)制編碼)求函數(shù)最優(yōu)值方式,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2020-02-02
Python+PyQt5實(shí)現(xiàn)局域網(wǎng)文件共享工具
在局域網(wǎng)環(huán)境下快速傳輸大文件一直是辦公場(chǎng)景的剛需,本文介紹一款基于PyQt5+Socket開發(fā)的高顏值文件共享工具,有需要的小伙伴可以參考一下2025-07-07
pytorch 指定gpu訓(xùn)練與多gpu并行訓(xùn)練示例
今天小編就為大家分享一篇pytorch 指定gpu訓(xùn)練與多gpu并行訓(xùn)練示例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-12-12
python?opencv圖像的高通濾波和低通濾波的示例代碼
這篇文章主要介紹了python?opencv圖像的高通濾波和低通濾波,本文通過實(shí)例代碼給大家介紹的非常詳細(xì),對(duì)大家的學(xué)習(xí)或工作具有一定的參考借鑒價(jià)值,需要的朋友可以參考下2022-06-06
Python開發(fā)之SMTP連接與字符串處理錯(cuò)誤與解決方案
在Python開發(fā)過程中,開發(fā)者經(jīng)常會(huì)遇到各種錯(cuò)誤和異常,本文將總結(jié)兩個(gè)典型的Python開發(fā)問題,SMTP服務(wù)器連接失敗和f-string字符串處理錯(cuò)誤,有需要的可以參考下2025-05-05
在Pandas中DataFrame數(shù)據(jù)合并,連接(concat,merge,join)的實(shí)例
今天小編就為大家分享一篇在Pandas中DataFrame數(shù)據(jù)合并,連接(concat,merge,join)的實(shí)例,具有很好的參考價(jià)值,希望對(duì)大家有所幫助。一起跟隨小編過來看看吧2019-01-01

