You need to enable JavaScript to run this app. Selenium遇到'No tables found' ValueError时如何重载URL再跳转下一个链接
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.10.27 14:15:03