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

如何优化Python for循环逻辑实现动态表格数据完整爬取

动态表格爬取优化方案

以下是几种比固定循环、先取长度再循环更简洁高效的实现方式:

  • 方案1:直接定位所有行遍历(最优通用方案)
    不需要逐行拼接xpath索引,一次性获取表格下所有tr元素再遍历,自动适配任意行数,不会出现索引越界问题,代码冗余度更低:
import pandas as pd

table_row = []
# 直接获取表格下所有行元素
rows = browser.find_elements_by_xpath('//*[@id="companies-table-deal-announced"]/tbody/tr')
for row in rows:
    # 取当前行所有td的文本
    td_list = row.find_elements_by_tag_name('td')
    table_row.append([td.text for td in td_list])

df = pd.DataFrame(table_row,
                  columns=['SPAC', 'Target', 'Ticker', 'Announced', 'Deadline', 'TEV ($M)', 'TEV/IPO', 'Sector',
                           'Geography', 'Premium', 'Common', 'Warrant'])
  • 方案2:懒加载表格适配
    如果目标表格需要滚动才会加载更多数据,可以加滚动判断直到所有行加载完成,再执行方案1的遍历逻辑:
import pandas as pd
import time

# 先获取初始行数
prev_rows = 0
current_rows = len(browser.find_elements_by_xpath('//*[@id="companies-table-deal-announced"]/tbody/tr'))
# 滚动直到没有新行加载
while prev_rows != current_rows:
    prev_rows = current_rows
    # 滚动到表格最后一行
    browser.execute_script("arguments[0].scrollIntoView();", browser.find_elements_by_xpath('//*[@id="companies-table-deal-announced"]/tbody/tr')[-1])
    # 等待加载(可以根据页面响应速度调整等待时间)
    time.sleep(1)
    current_rows = len(browser.find_elements_by_xpath('//*[@id="companies-table-deal-announced"]/tbody/tr'))

# 加载完成后再遍历所有行,后续逻辑和方案1一致
  • 方案3:直接用pandas读取表格(轻量场景首选)
    如果表格结构规范、没有特殊的动态渲染逻辑,直接读取当前页面的HTML源码即可提取表格,不需要手写元素定位逻辑:
import pandas as pd

# 获取当前页面源码
page_html = browser.page_source
# 直接读取页面中的所有表格,对应索引选你的目标表格即可
df_list = pd.read_html(page_html)
df = df_list[0] # 下标根据你页面中表格的顺序调整即可
# 如果需要调整列名直接赋值df.columns即可

你原本想到的先获取总行数再循环的方案也可以正常使用,但相比方案1多了一次行数统计的步骤,且拼接xpath索引的写法更容易出现语法错误。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.06 07:24:00