Selenium 未通过类名、CSS 选择器、XPATH 查找特定元素

问题描述 投票:0回答:1

我上个月问了这个问题,但尚未找到解决方案,所以我决定改用 Selenium 看看是否有帮助。

我正在尝试抓取这个网站,但由于“下一步”按钮的问题,我只能抓取第一页,无论我使用什么作为定位器,都无法找到该按钮。我正在尝试检查“下一步”按钮的类名称中是否有“disabled”字符串,以便我的脚本可以知道它尚未到达最后一页并且可以继续抓取。无法通过 find_elements 或作为单个元素找到该按钮。分页区域中的所有元素都会发生这种情况,所以我什至无法解决这个问题。我收到空字符串、空列表或无此类元素异常。

这是一个最小的可重现示例:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

options = webdriver.ChromeOptions()
options.add_argument("--headless")
driver = webdriver.Chrome(options=options)
driver.implicitly_wait(0.5)

driver.get("https://ksa.carswitch.com/en/saudi/used-cars/search?page=1")

next_page_buttons = driver.find_elements(By.CSS_SELECTOR, ".page-number--next")
next_button = next_page_buttons[0]
if next_button.text == "":
    print("The element is empty.")

我尝试过的一些例子包括:

#next_page_button = self.driver.find_element(By.CSS_SELECTOR, ".page-number--next")

#next_page_button = self.driver.find_element(By.CLASS_NAME, "page-number page-number--next page-number--icon") 

#page_links = self.driver.find_elements(By.CSS_SELECTOR, ".page-number")
#lastpagelink = page_links[-1]
#last_page = int(lastpagelink.text) #trying to see if it returns last page number to loop through instead. Returns empty string.

#wait = WebDriverWait(self.driver, 100)
#pagination_links = [link.text for link in wait.until(EC.visibility_of_all_elements_located((By.CSS_SELECTOR, '.page-number--next')))] #Raised Timeout Exception
#pagination_links = [link.text for link in wait.until(EC.visibility_of_all_elements_located((By.XPATH, "//a[@class='page-number page-number--next page-number--icon']")))] #Timeout Exception again

...以及所有其他组合。这个问题可能与样式标签有关吗?我没有看到任何可能影响元素可见性的东西。

我将非常感谢任何帮助。谢谢你。

selenium-webdriver web-scraping
1个回答
0
投票

您可以更新下一页按钮的定位器,如下所示

//section[contains(@class,'heading show')]//a[contains(text(),'Next page')]

您可以使用下面的代码,我们检查下一页按钮是否在类中具有禁用属性,如果没有,则我们使用 JavaScript 单击单击下一页按钮并获取下一页上的价格,然后继续,直到按钮被禁用。您可以根据需要修改代码来提取数据

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.chrome.service import Service
from selenium.common.exceptions import NoSuchElementException
from webdriver_manager.chrome import ChromeDriverManager

# Initialize WebDriver
driver = webdriver.Chrome(service=Service(ChromeDriverManager().install()))
driver.implicitly_wait(10)
driver.get("https://ksa.carswitch.com/en/saudi/used-cars/search?page=1")

prices = []

def fetch_prices():
    prices_el = driver.find_elements(By.XPATH, "//div[@class='title']/span")
    return [el.text for el in prices_el]
    
prices.extend(fetch_prices())

while True:
        next_page_button = driver.find_element(By.XPATH, "//section[contains(@class,'heading show')]//a[contains(text(),'Next page')]")
        isDisabled="disabled" in  next_page_button.get_attribute("class")
        if isDisabled:
             break
        else: 
            driver.execute_script("arguments[0].click();", next_page_button)
            prices.extend(fetch_prices())
driver.quit()
print(prices)
© www.soinside.com 2019 - 2024. All rights reserved.