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

如何用jq调用外部pup命令提取JSON中HTML的script标签并生成新JSON

问题描述

给定如下输入JSON:

{
  "url": "https://www.example.com", 
  "html": "<html>...</html>"
}

需要结合jq和外部命令pup,从html字段中提取所有type="text/javascript"的<script>标签内容,最终生成如下结构的新JSON:

{
  "url": "https://www.example.com",
  "scripts": [
    "<script>...",
    "<script>..."
  ]
}

直接在jq表达式内部调用pup会失败,因为pup不是jq内置功能,比如以下命令无法生效:

jq -c '{url: .url, scripts: [.html | pup "script[type=text/javascript] text{}"]}'
解决方案

由于jq无法直接在表达式内部调用外部命令处理字段内容,可通过分步提取+组合的方式实现需求,以下是两种可行方案:

方案1:使用临时变量分步处理

先单独提取url,再处理html得到脚本数组,最后用jq将两者组合成目标JSON:

# 提取url到变量
URL=$(jq -r '.url' example.json)
# 处理html,将pup输出的每行脚本转为JSON字符串数组
SCRIPTS=$(jq -r '.html' example.json | pup 'script[type="text/javascript"] text{}' | jq -R . | jq -s .)
# 构造最终JSON
jq -n --arg url "$URL" --argjson scripts "$SCRIPTS" '{url: $url, scripts: $scripts}'

方案2:单管道无临时变量处理

通过shell子shell读取url并同步处理html,一步完成组合:

jq -r '.url + "\n" + .html' example.json | {
  read URL
  # 将pup输出的每行脚本转为JSON数组
  SCRIPTS=$(pup 'script[type="text/javascript"] text{}' | jq -R . | jq -s .)
  jq -n --arg url "$URL" --argjson scripts "$SCRIPTS" '{url: $url, scripts: $scripts}'
}

关键步骤说明

  1. pup 'script[type="text/javascript"] text{}':提取所有目标脚本内容,每行输出一个脚本
  2. jq -R .:将每行文本转为合法的JSON字符串
  3. jq -s .:将所有JSON字符串合并为一个数组
  4. jq -n --arg ... --argjson ...:通过参数传入url和scripts数组,构造目标JSON结构

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.29 08:08:13