小能豆

Python Selenium 单击表格上的“加载更多”

py

最后一行有“加载更多”表行,我不知道如何加载。到目前为止,我尝试了不同的方法,但都没有奏效,

  1. 我尝试通过以下方式单击该行本身:
from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)
soup = BeautifulSoup(driver.page_source, 'html.parser')

table = soup.find('table', {"class": "competition-leaderboard__table"})

i = 0
for team in table.find.all('tbody'):
    rows = team.find_all('tr')
    for row in rows:
        i = i + 1
        if (i == 51):
            row.click()

        //the scraping code for the first 50 elements

上面的代码抛出一个错误,提示“‘NoneType’对象不可调用”。

我尝试过的另一件事,但没有起作用,如下所示:我尝试通过其类别来加载更多表行并单击它。

from selenium import webdriver
driver = webdriver.Chrome()
driver.get(url)

load_more = driver.find_element_by_class_name('competition-leaderboard__load-more-wrapper')
load_more.click()

soup = BeautifulSoup(driver.page_source, 'html.parser')

上面的代码也不起作用。

所以我的问题是如何让 python 单击“加载更多”表行,因为在网站的 HTML 结构中,加载更多”似乎不是一个可单击的按钮。


阅读 77

收藏
2025-03-02

共1个答案

小能豆

你可以尝试以下方法来处理“加载更多”按钮,具体取决于网站的 JavaScript 交互方式。


1. 确保 click() 适用于该元素

在 Selenium 中,click() 只能用于可点击的元素(如 <button><a>)。你可以尝试使用 JavaScript 来触发点击:

from selenium import webdriver
from selenium.webdriver.common.by import By
from selenium.webdriver.common.action_chains import ActionChains
from selenium.webdriver.common.keys import Keys
import time

# 启动 WebDriver
driver = webdriver.Chrome()
driver.get("你的 URL")

# 等待页面加载
time.sleep(3)  # 视情况增加等待时间

# 找到 "加载更多" 按钮
try:
    load_more = driver.find_element(By.CLASS_NAME, "competition-leaderboard__load-more-wrapper")

    # 使用 JavaScript 强制点击
    driver.execute_script("arguments[0].click();", load_more)

    # 等待新数据加载
    time.sleep(3)

except Exception as e:
    print("未找到 '加载更多' 按钮或无法点击:", e)

# 获取更新后的 HTML
soup = BeautifulSoup(driver.page_source, 'html.parser')

2. 使用 ActionChains 进行点击

如果 click() 无法直接生效,你可以使用 ActionChains

from selenium.webdriver.common.action_chains import ActionChains

load_more = driver.find_element(By.CLASS_NAME, "competition-leaderboard__load-more-wrapper")
actions = ActionChains(driver)
actions.move_to_element(load_more).click().perform()

3. 发送 ENTERSPACE 触发加载

某些网站可能使用键盘事件来触发“加载更多”,你可以尝试:

load_more = driver.find_element(By.CLASS_NAME, "competition-leaderboard__load-more-wrapper")
load_more.send_keys(Keys.ENTER)

或者:

load_more.send_keys(Keys.SPACE)

4. 确保 加载更多 按钮在可视区域

有时元素不在视图内,你需要先滚动到它的位置:

driver.execute_script("arguments[0].scrollIntoView();", load_more)
time.sleep(1)  # 让页面滚动后稳定
load_more.click()

5. 确保 加载更多 按钮在 DOM 中

有时元素可能在初始 HTML 加载时不可见,需要先等待它出现:

from selenium.webdriver.support.ui import WebDriverWait
from selenium.webdriver.support import expected_conditions as EC

try:
    load_more = WebDriverWait(driver, 10).until(
        EC.element_to_be_clickable((By.CLASS_NAME, "competition-leaderboard__load-more-wrapper"))
    )
    load_more.click()
except Exception as e:
    print("无法点击 '加载更多':", e)

6. 循环点击直到没有更多数据

有些网站可能需要多次点击“加载更多”才能加载所有数据:

while True:
    try:
        load_more = driver.find_element(By.CLASS_NAME, "competition-leaderboard__load-more-wrapper")
        driver.execute_script("arguments[0].click();", load_more)
        time.sleep(3)  # 适当等待新数据加载
    except:
        print("所有数据已加载")
        break

7. 检查网络请求

有些网站不会使用 click() 来加载更多数据,而是通过 AJAX 请求动态获取新数据。在 Chrome 开发者工具 (F12) → NetworkXHR 选项卡下,你可以检查网站在点击“加载更多”时发送了哪些请求,并直接使用 requests 抓取这些数据。

如果发现是 XHR 请求,你可以用 requests 直接请求数据,而不需要 Selenium。


总结

  • 优先使用 JavaScript (execute_script("arguments[0].click();", element))
  • 滚动到可见区域 (scrollIntoView())
  • 使用 WebDriverWait 确保元素可点击
  • 尝试 ActionChainssend_keys(Keys.ENTER)
  • 如果数据是 AJAX 载入,直接抓取 API

可以先尝试 方案 1 和 2,如果不行再考虑 方案 6 进行循环点击。🚀

2025-03-02