最后一行有“加载更多”表行,我不知道如何加载。到目前为止,我尝试了不同的方法,但都没有奏效,
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 结构中,“加载更多”似乎不是一个可单击的按钮。
你可以尝试以下方法来处理“加载更多”按钮,具体取决于网站的 JavaScript 交互方式。
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')
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()
ENTER
或 SPACE
触发加载某些网站可能使用键盘事件来触发“加载更多”,你可以尝试:
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)
加载更多
按钮在可视区域有时元素不在视图内,你需要先滚动到它的位置:
driver.execute_script("arguments[0].scrollIntoView();", load_more)
time.sleep(1) # 让页面滚动后稳定
load_more.click()
加载更多
按钮在 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)
有些网站可能需要多次点击“加载更多”才能加载所有数据:
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
有些网站不会使用 click()
来加载更多数据,而是通过 AJAX
请求动态获取新数据。在 Chrome 开发者工具 (F12
) → Network
→ XHR
选项卡下,你可以检查网站在点击“加载更多”时发送了哪些请求,并直接使用 requests
抓取这些数据。
如果发现是 XHR
请求,你可以用 requests
直接请求数据,而不需要 Selenium。
execute_script("arguments[0].click();", element)
)scrollIntoView()
)WebDriverWait
确保元素可点击ActionChains
或 send_keys(Keys.ENTER)
AJAX
载入,直接抓取 API可以先尝试 方案 1 和 2,如果不行再考虑 方案 6 进行循环点击。🚀