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

Playwright无头浏览器提取表格Href报错:事件循环已关闭

解决Playwright "Event loop is closed!" 错误

核心原因与修复方案

1. 严格使用异步上下文管理器

这个错误大多是因为浏览器/页面实例在事件循环关闭后仍被访问,必须用async with完整包裹Playwright的资源生命周期,确保操作完成后才释放资源。

正确示例代码:

import asyncio
from playwright.async_api import async_playwright

async def get_table_links(target_url):
    async with async_playwright() as p:
        # 启动无头浏览器
        browser = await p.chromium.launch(headless=True)
        async with browser.new_page() as page:
            await page.goto(target_url, wait_until="domcontentloaded")
            # 定位首个表格内的所有链接
            link_elements = await page.locator("table:first-of-type a").all()
            full_urls = []
            for elem in link_elements:
                href = await elem.get_attribute("href")
                if href:
                    # 补全相对路径为完整URL
                    full_url = page.url + href if href.startswith("/") else href
                    full_urls.append(full_url)
            return full_urls
        # 上下文结束自动关闭页面,最后关闭浏览器
        await browser.close()

# 启动异步任务
if __name__ == "__main__":
    target_url = "你的目标页面URL"
    result = asyncio.run(get_table_links(target_url))
    print(result)

2. 避免同步/异步代码混用

不要在同步函数里直接调用Playwright的异步方法,必须通过asyncio.run()作为异步入口,确保整个调用链处于同一个事件循环中。

3. 禁止提前释放资源

检查代码中是否存在在元素提取、属性获取完成前就调用browser.close()或page.close()的情况,所有DOM操作必须在页面/浏览器实例存活时完成。

4. 清理残留事件循环(针对重复运行场景)

如果脚本在Jupyter Notebook、测试框架等环境中多次执行,可能存在残留的已关闭事件循环,可提前初始化新循环:

import asyncio
try:
    loop = asyncio.get_event_loop()
    if loop.is_closed():
        asyncio.set_event_loop(asyncio.new_event_loop())
except RuntimeError:
    asyncio.set_event_loop(asyncio.new_event_loop())

代码排查要点

  • 对照报错栈的调用位置,定位触发错误的具体代码行,确认是否在实例已释放后仍执行操作
  • 确保所有await关键字都正确应用在Playwright的异步方法上
  • 检查wait_until参数是否合理(比如设为domcontentloaded或networkidle),避免页面未加载完成就开始提取元素

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.28 00:10:13