Selenium遇到'No tables found' ValueError时如何重载URL再跳转下一个链接
实现逻辑
核心目标是在触发ValueError: No tables found时执行单重重试,不打断整体URL循环流程。
- 收敛异常捕获范围,仅识别pandas解析时抛出的“未找到表格”错误
- 触发错误时执行一次当前页面重载,等待DOM渲染完成后重新尝试解析
- 重试后仍失败时返回空值,由外层循环自动跳过当前URL,继续处理下一个链接
代码修改方案
将原有parse_data函数改造为带单次重试的版本,其余外层循环逻辑无需调整:
def parse_data(url, max_retry=1): browser.get(url) for attempt in range(max_retry + 1): try: # 原有解析逻辑入口 df = pd.read_html(browser.page_source, header=0)[0] html = browser.page_source soup = bs(html, "lxml") cont = soup.find('div', {'id': 'wrap'}) content = cont.find('div', {'id': 'col-content'}) content = content.find('table', {'class': 'table-main'}, {'id': 'tournamentTable'}) main = content.find('th', {'class': 'first2 tl'}) if main is None: return None count = main.findAll('a') country = count[1].text league = count[2].text game_data = GameData() game_date = None for row in df.itertuples(): if not isinstance(row[1], str): continue elif ':' not in row[1]: game_date = row[1].split('-')[0] continue game_data.date.append(game_date) game_data.time.append(row[1]) game_data.game.append(row[2]) game_data.score.append(row[3]) game_data.home_odds.append(row[4]) game_data.draw_odds.append(row[5]) game_data.away_odds.append(row[6]) game_data.country.append(country) game_data.league.append(league) return game_data except ValueError as e: # 非目标解析异常直接抛出,不做拦截 if "No tables found" not in str(e): raise e # 已用完重试次数,返回空值供外层循环跳过 if attempt == max_retry: return None # 执行一次页面重载,等待元素加载 browser.refresh() time.sleep(2)
关键注意点
- 不要盲目捕获所有异常,必须校验错误信息是否为
No tables found,避免吞掉其他业务流程抛出的有效错误 - 重载后需预留加载等待时间,可替换为Selenium显式等待(判断目标表格元素是否存在),比固定
sleep的稳定性更高 - 外层
for url in urls的原有逻辑完全兼容该改造:当函数返回None时,会自动执行continue进入下一个URL的处理流程
效果验证:当页面首次加载异常触发
No tables found错误时,程序会自动调用browser.refresh()重载当前URL,重新尝试一次解析;如果重试后仍无法获取表格,会直接跳过当前链接,不会中断整个爬取流程。
内容的提问来源于stack exchange,提问作者user15519043
相关产品推荐
相关产品推荐

