如何用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
相关产品推荐
相关产品推荐

