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

Python生成站点地图时遇RuntimeError:事件循环已运行

解决RuntimeError: This event loop is already running问题

问题根源

  1. 代码逻辑漏洞:你通过df.iterrows()循环读取Excel中的URL,但每次循环都会覆盖Url变量,最终仅保留最后一行的URL,无法批量处理所有链接。
  2. 事件循环冲突:从报错路径的ipykernel可判断你在Jupyter环境运行代码,Jupyter本身已启动一个asyncio事件循环,而pysitemap.crawler内部会尝试启动新的事件循环,两者冲突导致报错。

修复步骤

1. 安装依赖(按需)

若用nest_asyncio解决循环冲突,先执行安装命令:

pip install nest_asyncio

2. 修正后的完整代码

import sys
import logging
from pysitemap import crawler
import pandas
import nest_asyncio

# 允许嵌套事件循环,适配Jupyter环境的循环冲突问题
nest_asyncio.apply()

# 读取Excel数据(替换为你的实际文件路径)
df = pandas.read_excel(r'absoltepath')

if __name__ == '__main__':
    if '--iocp' in sys.argv:
        from asyncio import events, windows_events
        sys.argv.remove('--iocp')
        logging.info('using iocp')
        el = windows_events.ProactorEventLoop()
        events.set_event_loop(el)
    
    # 循环处理Excel中的每个URL,生成对应站点地图
    for index, row in df.iterrows():
        target_url = row['data']
        crawler(target_url, out_file=f'{index}_sitemap.xml')

3. 关键改动说明

  • 修复批量处理逻辑:将iterrows()循环移入if __name__ == '__main__'代码块,确保每个URL都被单独处理,生成对应索引的站点地图文件。
  • 解决循环冲突:通过nest_asyncio.apply()允许在已有事件循环的环境中启动新循环,完美适配Jupyter运行场景。
  • 规范变量命名:将大写的Url改为小写target_url,符合Python命名习惯,提升代码可读性。

替代方案:命令行运行普通脚本

若无需在Jupyter中执行,直接将代码保存为.py文件,通过命令行运行即可,此时不需要nest_asyncio依赖(普通脚本无预运行的事件循环):

python your_script_name.py

内容的提问来源于stack exchange,提问作者Muhammad Tayyab Shah

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.21 21:54:14