我正在嘗試使用 selenium 來抓取動態網頁。在這里,我嘗試列印網站中的所有作者
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get("https://quotes.toscrape.com/js")
elements = driver.find_elements_by_class_name("author")
for i in elements:
print(i.text)
driver.quit()
效果很好,并列印了正確的結果:
Albert Einstein
J.K. Rowling
Albert Einstein
Jane Austen
Marilyn Monroe
Albert Einstein
André Gide
Thomas A. Edison
Eleanor Roosevelt
Steve Martin
但是當我嘗試為另一個網站使用類似的代碼時
我收到一個錯誤:
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid locator
(Session info: chrome=98.0.4758.102)
這是我的第二個代碼:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
url = 'https://www.myperfume.co.il/155567-כל-המותגים-לגבר?order=up_title'
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.get(url)
elements = driver.find_elements_by_class_name("title text-center")
for i in elements:
print(i.text)
driver.quit()
我在這段代碼中試圖做的是列印網頁中所有 perdumes 的名稱。檢查后我看到所有的名字都在一個名為:'title text-center'的類中。
如何修復我的代碼?
uj5u.com熱心網友回復:
此錯誤訊息...
selenium.common.exceptions.InvalidArgumentException: Message: invalid argument: invalid locator
...暗示您使用的定位器策略不是有效的定位器策略,因為By.CLASS_NAME將單個類名作為引數。
要列印網頁中所有香水的名稱,您可以使用List Comprehension,您可以使用以下Locator Strategy:
使用css_selector:
driver.get("https://www.myperfume.co.il/155567-כל-המותגים-לגבר?order=up_title") print([my_elem.get_attribute("innerHTML") for my_elem in driver.find_elements_by_css_selector("h3.title")])
理想情況下,您需要為visibility_of_all_elements_located()引入WebDriverWait,您可以使用以下定位器策略:
使用
CSS_SELECTOR和get_attribute("innerHTML"):driver.get("https://www.myperfume.co.il/155567-כל-המותגים-לגבר?order=up_title") print([my_elem.text for my_elem in WebDriverWait(driver, 20).until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, "h3.title")))])控制臺輸出:
[' 212 ?? ?? ?? ???? ?.?.? 212 vip for men e.d.t ', ' 212 ??? ???? ???? ?.?.? 212 nyc for men e.d.t ', ' 212 ???? ???? ?.?.? 212 sexy men e.d.t ', ' ????????? ???? 100 ?? ?.?.? Abercrombie & Fitch Fierce 100 ml e.d.c ', ' ????????? ???? 50 ?? ?.?.? Abercrombie & Fitch Fierce 50 ml e.d.c ', ' ????????? ???? ???? ??? 200 ?? ?.?.? Abercrombie & Fitch Fierce 200 ml e.d.c ', ' ????????? ????? ????????? ???? ?.?.? Abercrombie & Fitch First Instinct e.d.t ', ' ??????? ?.?.? Egoiste e.d.t ', ' ??????? ??????? ?.?.? Egoiste Platinum e.d.t ', ' ?? ?? ???? ?.?.? Eau De Blanc e.d.t ', ' ?? ?? ??? ?.?.? Eau Fraiche e.d.t ', ' ???????? ???? ?.?.? Obsession for men e.d.t ']注意:您必須添加以下匯入:
from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.common.by import By from selenium.webdriver.support import expected_conditions as EC
uj5u.com熱心網友回復:
title text-center實際上是 2 個類名title和text-center.
為了通過 2 個類名定位元素,您必須使用 XPath 或 CSS 選擇器。
所以,而不是
elements = driver.find_elements_by_class_name("title text-center")
您可以使用
elements = driver.find_elements_by_xpath("//h3[@class='title text-center']")
要么
elements = driver.find_elements_css_selector("h3.title.text-center")
此外,您應該添加等待以僅在加載并準備好時才訪問 Web 元素。
這應該通過預期條件顯式等待來完成,如下所示:
from selenium import webdriver
from selenium.webdriver.chrome.service import Service
from webdriver_manager.chrome import ChromeDriverManager
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC
url = 'https://www.myperfume.co.il/155567-כל-המותגים-לגבר?order=up_title'
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
wait = WebDriverWait(driver, 20)
driver.get(url)
wait.until(EC.visibility_of_element_located((By.CSS_SELECTOR, "h3.title.text-center")))
elements = driver.find_elements_css_selector("h3.title.text-center")
for i in elements:
print(i.text)
driver.quit()
轉載請註明出處,本文鏈接:https://www.uj5u.com/gongcheng/428339.html
