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

如何用Python修改Markdown文件中<img>标签的src属性

如何用Python修改Markdown文件中标签的src属性

嘿,我懂你现在卡在哪了——你已经能成功揪出目标img标签的src属性,但因为是先把Markdown转成HTML处理的,不知道怎么把修改后的内容写回原Markdown文件里对吧?其实这里有个小坑:把Markdown转成HTML再修改,再转回去很容易弄丢原文件的格式或者其他Markdown语法,不如直接对原Markdown文本里的HTML <img> 标签动手,这样更稳妥。

下面给你两种实用的方法,按需选择:

方法一:用正则表达式直接处理(简单高效)

如果你的<img>标签结构不算特别复杂,用正则表达式直接匹配替换是最快的方式,能精准定位到id为updatable的img标签,替换它的src属性,还不会改动原文件的其他内容。

import re
import chardet

def get_encoding_type(file_path):
    with open(file_path, 'rb') as f:
        sample = f.read(1024)
        cur_encoding = chardet.detect(sample)['encoding']
        return cur_encoding

# 读取原Markdown文件
file_path = "README.md"
encoding = get_encoding_type(file_path)
with open(file_path, "r", encoding=encoding, errors='ignore') as f:
    md_content = f.read()

# 设置你想要替换成的新src路径
new_src = "new-image-path.png"

# 正则匹配id为updatable的img标签,替换src属性
# 正则会忽略大小写,不管id和src的顺序如何都能匹配
updated_md = re.sub(
    r'(<img[^>]*id="updatable"[^>]*src=")[^"]*(")',
    r'\1' + new_src + r'\2',
    md_content,
    flags=re.IGNORECASE
)

# 将修改后的内容写回原文件
with open(file_path, "w", encoding=encoding) as f:
    f.write(updated_md)

小提示:如果你的img标签里有换行或者更复杂的属性,这个正则依然能工作,因为[^>]*会匹配标签里除了>`之外的所有内容。

方法二:用BeautifulSoup处理复杂HTML场景

如果你的<img>标签结构特别复杂(比如嵌套了其他属性、有换行或者多个同类标签),可以用BeautifulSoup来解析HTML片段,确保修改的准确性。

from bs4 import BeautifulSoup
import re
import chardet

def get_encoding_type(file_path):
    with open(file_path, 'rb') as f:
        sample = f.read(1024)
        cur_encoding = chardet.detect(sample)['encoding']
        return cur_encoding

file_path = "README.md"
encoding = get_encoding_type(file_path)
with open(file_path, "r", encoding=encoding, errors='ignore') as f:
    md_content = f.read()

# 提取原Markdown里所有的HTML标签片段
html_blocks = re.findall(r'(<[^>]+>)', md_content)

updated_blocks = []
for block in html_blocks:
    # 用BeautifulSoup解析每个HTML片段
    soup = BeautifulSoup(block, "html.parser")
    img_tag = soup.find("img", id="updatable")
    if img_tag:
        # 更新src属性为新路径
        img_tag['src'] = "new-image-path.png"
        # 把修改后的HTML片段转成字符串
        updated_blocks.append(str(soup))
    else:
        # 不是目标标签,直接保留原内容
        updated_blocks.append(block)

# 将处理后的HTML片段替换回原Markdown内容
temp_md = md_content
for old_block, new_block in zip(html_blocks, updated_blocks):
    temp_md = temp_md.replace(old_block, new_block)

# 写回原文件
with open(file_path, "w", encoding=encoding) as f:
    f.write(temp_md)

这个方法的思路是:先把Markdown里的所有HTML片段挑出来单独处理,修改完再放回去,既利用了BeautifulSoup强大的HTML解析能力,又不会破坏原Markdown的格式和其他内容。

备注:内容来源于stack exchange,提问作者lony235

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.04.14 14:19:51