Python使用replace替换HTML外部资源引用时偶发丢失</script>标签
- 文件读取编码异常:打开JS文件时没有显式指定编码,当文件包含非ASCII字符时,读取操作会被意外截断,导致后续拼接的
</script>闭合标签无法正常写入。 - 多次IO操作异常:现有逻辑每处理一个引用文件就遍历写入一次整个HTML文件,
fileinput的inplace模式在高频次写入时可能出现缓冲区刷新异常,导致末尾内容丢失。 - 特殊字符干扰:如果JS文件末尾包含DOS系统的EOF控制字符(0x1A)、异常回车符
\r,文本模式读取时会提前终止读取,或是输出时回车符将后续闭合标签内容覆盖。 - 误匹配重复替换:如果JS代码内部包含和引用文件名相同的字符串,会触发二次替换,把已经拼接好的标签内容再次替换,导致结构损坏。
- 优先将HTML内容读入内存一次性处理,避免多次IO操作,同时用正则精准匹配引用标签避免误匹配,参考代码如下:
import re FILES = ["firstScript.js", "secondScript.js"] # 指向未经过替换的原始开发版HTML文件 INPUT_HTML = "path/to/origin.html" OUTPUT = "path/to/build.html" # 先读取原始HTML全量内容 with open(INPUT_HTML, "r", encoding="utf-8") as f: html_content = f.read() for js_file in FILES: # 显式指定编码读取JS内容 with open(js_file, "r", encoding="utf-8") as f: js_content = f.read() # 正则精准匹配对应script引用标签,避免误匹配JS内部的文件名字符串 pattern = re.compile(rf'<script\s+src=["\']{re.escape(js_file)}["\']\s*></script>') replace_content = f"<script>\n{js_content}\n</script>" html_content = pattern.sub(replace_content, html_content) # 一次性写入最终构建产物 with open(OUTPUT, "w", encoding="utf-8") as f: f.write(html_content)
- 清理JS文件中的异常控制字符,确保文件末尾没有多余的不可见字符。
- 拼接嵌入标签时,在闭合标签前后添加换行符,避免和相邻内容粘连导致解析异常。
内容的提问来源于stack exchange,提问作者Ltoll

