如何优化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
相关产品推荐
相关产品推荐

