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

如何用jq从yt-dlp的JSON输出中仅提取存在的章节字段

解决jq遍历null报错的问题

原命令执行时出现jq: error (at :1): Cannot iterate over null (null),原因很直接:当视频没有章节时,.chapters字段的值是null,直接用.chapters[]遍历会触发jq的空值遍历错误。

下面给两种修正方案,按需选择:

方案1:无章节时Chaps字段为空字符串

不管视频有没有章节,都会保留Chaps字段,无章节时该字段值为空字符串。

完整命令:

yt-dlp --dump-json https://www.youtube.com/watch?v=nochapters | jq -cr '{ Date: .upload_date | (.[0:4] + "-" + .[4:6] + "-" + .[6:8]), ID: .id, Title: .fulltitle, Chaps: (.chapters // []) | map(.title) | join(", ") }'

关键改动:

  • 用(.chapters // [])替代直接调用.chapters://是jq的空值合并运算符,当.chapters为null时,自动替换成空数组[],避免遍历报错
  • 用map(.title)提取所有章节标题,再通过join(", ")拼接成字符串

方案2:无章节时不显示Chaps字段

仅在视频有章节时输出Chaps字段,无章节时直接省略该字段。

完整命令:

yt-dlp --dump-json https://www.youtube.com/watch?v=nochapters | jq -cr '{ Date: .upload_date | (.[0:4] + "-" + .[4:6] + "-" + .[6:8]), ID: .id, Title: .fulltitle } + (if .chapters then { Chaps: .chapters | map(.title) | join(", ") } else {} end)'

关键改动:

  • 先构造包含Date、ID、Title的基础JSON对象
  • 通过+运算符结合条件判断:如果.chapters存在(非null),就追加带Chaps字段的对象;否则追加空对象,相当于不添加任何额外字段

效果验证

针对你提供的含章节输入,两种方案都会输出符合预期的结果:

{"Date":"2020-06-17","ID":"pvkTC2xIbeY","Title":"How to Add Chapters to YouTube Videos | Chapters Explained","Chaps":"Intro, YouTube Chapters, What are YouTube chapters?, How to add chapter markers?, When are changes updated?, How to disable chapters?, Are chapters available in my country?"}

当视频无章节时,方案1输出示例:

{"Date":"2024-01-01","ID":"nochapters","Title":"无章节视频标题","Chaps":""}

方案2输出示例:

{"Date":"2024-01-01","ID":"nochapters","Title":"无章节视频标题"}

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.09 14:25:10