selenium中有8種不錯的元素定位方式,每個方式和應用場景都不一樣,需要根據自己的使用情況來進行修改
8種find_element元素定位方式
- 1.id定位
- 2.CSS定位
- 3.XPATH定位
- 4.name定位
- 5.class_name定位
- 6.Link_Text定位
- 7.PARTIAL_LINK_TEXT定位
- 8.TAG_NAME定位
- 總結
目前selenium已經出現了新的版本的定位方式,雖然說定位語法不一樣,但是萬變不離其宗。
用舊版的定位語法就會出現這個刪除線,你用他來進行爬蟲的時候運行時就會提示你雖然問題不大但是還是得考慮使用新版本的定位方式
DeprecationWarning: find_element_by_css_selector is deprecated. Please use find_element(by=By.CSS_SELECTOR, value=css_selector) insteadline = li.find_element_by_css_selector("p.title a ").get_attribute('href')
- selenium中find_element定位方式
- find_element(By.XPATH)
- find_element(By.CSS_SELECTOR)
- find_element(By.ID)
- find_element(By.TAG_NAME)
- find_element(By.class_name,)
- find_element(By.PARTIAL_LINK_TEXT)
- find_element(By.LINK_TEXT)
- find_element(By.name)
上面定位元素方法主要是單個,多個元素定位就在element后面加個s
1.id定位
在網站中有很多的id,我們可以通過找到這些id來幫助我們定位網頁中的元素,但是id定位有缺點就是id元素往往是單一個存在,如果我們需要定位多個id的話id定位就不好幫助我們進行定位。
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 創建Chrome參數對象
opt.headless = True # 把Chrome設置成可視化無界面模式,windows/Linux 皆可
driver = webdriver.Chrome()
driver.get("網址")
a1 = driver.find_element(By.ID,'livenews-id-1-202301272620080422').text
print(a1)
2.CSS定位
css定位是最佳推薦的定位元素,不僅僅效率高,而且針對復雜場景的多個元素定位需求會比xpath和其他元素定位更好
在網頁中快速定位我一般都是在開發者工具中找到selector然后針對這個標簽進行選擇
#livenews-id-1-202301272620081211 > div.media-content > h2 > a
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 創建Chrome參數對象
opt.headless = True # 把Chrome設置成可視化無界面模式,windows/Linux 皆可
driver = webdriver.Chrome()
driver.get("網站")
a1 = driver.find_element(By.CSS_SELECTOR,'#livenews-id-1-202301272620081211 > div.media-content > h2 > a').text
print(a1)
當然我們真正實際上使用的時候就不用那么復雜,如果我們找到了父元素,再去找子元素時就可以直接對里面的標簽進行選擇比如我們已經知道是在要的內容在div下的a標簽中
div標簽我們已經獲取那么a標簽的內容就可以直接選擇a標簽,也可以用h2 a 這樣就表示選中h2標簽中的所有a標簽
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 創建Chrome參數對象
opt.headless = True # 把Chrome設置成可視化無界面模式,windows/Linux 皆可
driver = webdriver.Chrome()# Chrome瀏覽器
driver.get("網站")
f1=driver.find_elements(By.XPATH,'//*[@id="livenews-id-1-202301282620082087"]')
for i,f2 in enumerate(f1):if i < 2:a1 = f2.find_element(By.CSS_SELECTOR, 'a').textprint(a1)
復雜標簽應用可以參考這篇文章Python使用selenium中的CSS_SELECTOR進行搞定復雜多標簽定位
css里面還有許多豐富的選擇器可以參考這篇文章css選擇器
3.XPATH定位
classname 選取所有的子節點
/ 從根節點選
// 匹配任意節點不考慮位置
. 選取當前節點。
用…選中當前節點的父節點
@ 選取屬性
還可以用xpath的通配符選取節點
用*匹配任何元素的節點
用@*來匹配任何屬性的節點
用node來匹配任意類型的節點
用//*來選中所有的元素
//div[@*]選中所有div屬性的元素
在實際中的應用場景
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 創建Chrome參數對象
opt.headless = True # 把Chrome設置成可視化無界面模式,windows/Linux 皆可
driver = webdriver.Chrome()# Chrome瀏覽器
driver.get("網站")
f1=driver.find_element(By.XPATH,'//*[@id="livenews-id-1-202301282620139465"]/div[1]/h2/a').get_attribute('text')
print(f1)
更多xpath定位可以參考這篇文章如何使用Xpath定位元素
4.name定位
name可以指定頁面中的標簽名,如果頁面中沒有重復name就可以使用,如果頁面中有多個重復的name就不推薦使用
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 創建Chrome參數對象
opt.headless = True # 把Chrome設置成可視化無界面模式,windows/Linux 皆可
driver = webdriver.Chrome()# Chrome瀏覽器
driver.get("網址")
f1=driver.find_element(By.NAME,'description')
print(f1)
5.class_name定位
class標簽也是selenium指定的標簽定位方式,但是這種方式實際中還是不推薦使用因為你會遇到一個div標簽中出現非常多重復的class名
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 創建Chrome參數對象
opt.headless = True # 把Chrome設置成可視化無界面模式,windows/Linux 皆可
driver = webdriver.Chrome()# Chrome瀏覽器
driver.get("網址")
f1=driver.find_element(By.CLASS_NAME,'time').text
print(f1)
6.Link_Text定位
專門定位文本的標簽,需要指定標簽內全部的文本內容才能夠進行定位,否則是無法定位成功
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 創建Chrome參數對象
opt.headless = True # 把Chrome設置成可視化無界面模式,windows/Linux 皆可
driver = webdriver.Chrome()# Chrome瀏覽器
driver.get("網址")
f1=driver.find_element(By.LINK_TEXT,'焦點').text
print(f1)
7.PARTIAL_LINK_TEXT定位
指定某部分文本即可定位成功,不用將文本內容全部輸入即可定位成功
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 創建Chrome參數對象
opt.headless = True # 把Chrome設置成可視化無界面模式,windows/Linux 皆可
driver = webdriver.Chrome()# Chrome瀏覽器
driver.get("網址")
f1=driver.find_element(By.PARTIAL_LINK_TEXT,'三亞').text
8.TAG_NAME定位
tag表示定位的一類功能,也就是用來定位div、h2這一類標簽往往沒什么用處,識別率特別低,頁面中有非常多個div標簽,而且你獲取到的數據會非常混亂,數據清洗起來異常復雜
使用tag定位一下子就把整個頁面所有的div信息給你獲取下來
from selenium import webdriver
from selenium.webdriver import Chrome, ChromeOptions
from selenium.webdriver.common.by import By
opt = ChromeOptions() # 創建Chrome參數對象
opt.headless = True # 把Chrome設置成可視化無界面模式,windows/Linux 皆可
driver = webdriver.Chrome()# Chrome瀏覽器
driver.get("網址")
f1=driver.find_element(By.TAG_NAME,'div').text
print(f1)
總結
如果要從想要更加快速搞定爬蟲的內容,建議只搞xpath、css這兩種定位方式,吃透就能夠應對絕大多數的爬蟲情況,當然如果有反爬蟲網站效果就不理想要自行處理。