You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Python脚本爬取分页HTML表格异常:点击下一页仍导出首10条数据

问题解决:动态加载表格的抓取与导出

问题根源

你当前的代码仅用BeautifulSoup解析了页面初始加载的静态HTML,而网页的“加载下10条”功能是通过JavaScript动态请求数据并渲染到页面中的。初始HTML里只有前10条记录,后续数据是点击按钮后才加载到DOM中的——哪怕你手动触发了加载按钮,只要脚本没重新获取更新后的页面内容,解析的还是最初的那10条数据。

解决方案:用Selenium模拟浏览器动态操作

要抓取动态加载的内容,需要用能模拟真实浏览器行为的工具(比如Selenium),它可以帮你点击加载按钮、等待新数据渲染完成,再抓取完整的表格内容。

步骤与代码示例

  1. 先安装依赖:
pip install selenium pandas

同时下载对应浏览器的驱动(比如Chrome浏览器的ChromeDriver),确保驱动版本和浏览器版本匹配。

  1. 修改后的抓取脚本:
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
from bs4 import BeautifulSoup
import pandas as pd

# 初始化浏览器(这里以Chrome为例,需确保ChromeDriver路径正确)
driver = webdriver.Chrome()
driver.get("你的目标网页URL")

try:
    # 循环点击加载按钮,直到按钮消失或无法点击(根据实际页面调整选择器)
    while True:
        try:
            # 等待加载按钮出现,然后点击
            load_button = WebDriverWait(driver, 10).until(
                EC.element_to_be_clickable((By.ID, "加载按钮的ID"))
            )
            load_button.click()
            # 等待新数据加载完成(这里以表格行数变化为判断条件,可根据实际调整)
            current_row_count = len(driver.find_elements(By.CSS_SELECTOR, "#pageLayout_projectTeamMembersGridView_gridView tr"))
            WebDriverWait(driver, 10).until(
                lambda d: len(d.find_elements(By.CSS_SELECTOR, "#pageLayout_projectTeamMembersGridView_gridView tr")) > current_row_count
            )
        except:
            # 没有更多数据可加载时退出循环
            break

    # 获取更新后的页面HTML,解析表格
    soup = BeautifulSoup(driver.page_source, 'html.parser')
    table1 = soup.find('table', id='pageLayout_projectTeamMembersGridView_gridView')
    
    # 提取表头
    headers = [th.text.strip() for th in table1.find_all('th')]
    df = pd.DataFrame(columns=headers)
    
    # 提取所有行数据
    for row in table1.find_all('tr')[1:]:
        row_data = [td.text.strip() for td in row.find_all('td')]
        if row_data:  # 跳过空行
            df.loc[len(df)] = row_data

    # 导出CSV
    df.to_csv('Export.csv', index=False)
    print("数据导出完成")

finally:
    # 关闭浏览器
    driver.quit()

关键注意点

  • 替换代码中的"你的目标网页URL"和"加载按钮的ID"为页面实际的URL和按钮ID(可通过浏览器开发者工具查看按钮的ID或其他选择器)。
  • 等待条件可根据页面实际情况调整:比如有的页面加载新数据时会有加载动画,可改为等待加载动画消失;或者直接固定等待几秒(不推荐,不如智能等待可靠)。
  • 如果加载按钮是通过其他元素触发(比如class选择器),把By.ID换成By.CLASS_NAME或By.CSS_SELECTOR即可。

内容的提问来源于stack exchange,提问作者Herve

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.14 02:10:57