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

使用Pandoc转换HTML为Markdown时图片链接冗余问题求助

解决Pandoc转换HTML到Markdown时图片链接冗余问题

问题背景

当HTML中存在<a>标签包裹<img>的结构时:

<a href="./assets/3sIcgyHnp7HfaxQy.jpeg">
    <img class="img-hide" src="./assets/3sIcgyHnp7HfaxQy.jpeg">
</a>

使用Pandoc转换为GFM格式时,会生成嵌套的图片链接格式:

[![](./assets/3sIcgyHnp7HfaxQy.jpeg)](./assets/3sIcgyHnp7HfaxQy.jpeg)

而我们需要的是普通图片引用格式:

![](./assets/3sIcgyHnp7HfaxQy.jpeg)

解决方案

方法1:使用Pandoc Lua过滤器(推荐)

Lua过滤器可以直接修改Pandoc的抽象语法树(AST),精准处理这种嵌套结构。

  1. 创建一个名为unwrap-image-links.lua的过滤器文件,内容如下:
-- 检测链接节点内部是否仅包含单个图片节点,若是则返回图片节点
function Link(el)
  if #el.content == 1 and el.content[1].t == "Image" then
    -- 保留图片的原始属性,移除外层链接
    return el.content[1]
  end
end
  1. 修改原脚本中的Pandoc命令,添加--lua-filter参数:
# Converts html files into md files (in same location as html files)

success=true

# Use the current working directory as the root directory
root_dir="."

# Recursively traverse the directory structure, suppressing output
find "$root_dir" -name '*.html' -type f -exec sh -c 'pandoc "$1" --lua-filter=unwrap-image-links.lua -t gfm-raw_html --wrap=none -o "${1%.html}.md" >/dev/null 2>&1 || success=false' _ {} \;

if $success; then
    echo "Successfully ran the script."
else
    echo "Some errors occurred during the process."
fi

方法2:转换后用sed批量替换

如果不想使用Lua过滤器,可以在转换完成后用sed命令批量修正Markdown文件的格式。这种方法依赖于链接和图片的路径完全一致:

修改原脚本的find执行部分,添加sed处理步骤:

# Converts html files into md files (in same location as html files)

success=true

# Use the current working directory as the root directory
root_dir="."

# Recursively traverse the directory structure, suppressing output
find "$root_dir" -name '*.html' -type f -exec sh -c '
  # 先执行Pandoc转换
  if ! pandoc "$1" -t gfm-raw_html --wrap=none -o "${1%.html}.md" >/dev/null 2>&1; then
    success=false
    return
  fi
  # 使用sed替换冗余的图片链接格式
  sed -i.bak "s/\[\!\(\[.*\]\(.*\)\)\]\2/\!\1/" "${1%.html}.md"
  # 删除sed生成的备份文件
  rm -f "${1%.html}.md.bak"
' _ {} \;

if $success; then
    echo "Successfully ran the script."
else
    echo "Some errors occurred during the process."
fi

原理说明

Pandoc默认会将HTML中的<a><img></a>解析为“可点击的图片”,对应Markdown的[![图片](图片地址)](链接地址)格式。上述两种方法分别从转换过程中修改AST和转换后修正文本两个角度,将这种嵌套格式简化为普通的图片引用。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.02 09:59:59