
使用 BeautifulSoup 的 append() 直接插入 HTML 字符串会导致标签被转义(如 变成 ),正确做法是通过 soup.new_tag() 创建真实标签对象再插入,从而保留原始 HTML 结构并兼容 UTF-8(如韩文)内容。
使用 beautifulsoup 的 `append()` 直接插入 html 字符串会导致标签被转义(如 `
` 变成 `
`),正确做法是通过 `soup.new_tag()` 创建真实标签对象再插入,从而保留原始 HTML 结构并兼容 UTF-8(如韩文)内容。
当你调用 soup.body.append(text) 且 text 是一个普通字符串(例如 "<p>exampletext</p>")时,BeautifulSoup 会将其视为纯文本内容而非可解析的 HTML 片段,因此自动对 、<code>>、& 等字符进行 HTML 实体转义,以防止 XSS 或解析歧义——这正是你看到 <p>exampletext</p> 的根本原因。
✅ 正确做法:使用 soup.new_tag() 构造 DOM 节点
将 Markdown 文章转换为微信公众号兼容的纯 HTML 格式。当用户要求"转成微信格式"、"生成公众号文章 HTML"、"排版到微信草稿箱"、"微信粘贴格式"时触发。输出带内联样式的纯 HTML,微信编辑器可直接渲染,无需额外适配。支持标题、段落、列表、粗体、行内代码、表格、引用块、代码块、配图的完整转换。
from bs4 import BeautifulSoup
# 安全读取含 UTF-8(如韩文)的 HTML 文件
with open("test/test.html", "r", encoding="utf-8") as f:
soup = BeautifulSoup(f, "html.parser")
# ✅ 创建真实 <p> 标签节点,而非字符串
p = soup.new_tag("p")
p.string = "exampletext" # 支持 Unicode,韩文、中文等均无问题
# 插入到 body 末尾
soup.body.append(p)
# 保存时指定 utf-8 编码,确保韩文不乱码
with open("test/result.html", "w", encoding="utf-8") as f:
f.write(str(soup))</p>
? 进阶技巧:
- 若需插入带子元素或属性的复杂 HTML,可链式构建:
div = soup.new_tag("div", **{"class": "notice", "id": "msg"}) div.append(soup.new_tag("strong")) div.strong.string = "알림:" soup.body.append(div) - 如必须从字符串解析 HTML 片段,应使用
BeautifulSoup(..., "html.parser").contents[0]或soup.from_string()(需bs4 >= 4.12.0),但更推荐new_tag方式——语义清晰、性能更好、无转义风险。
⚠️ 注意事项:
- 不要混用
from_encoding参数(已弃用);现代 BeautifulSoup 4+ 依赖文件打开时的encoding即可准确处理 UTF-8(含韩文、日文、中文)。 - 避免
soup.body.append(BeautifulSoup("<p>...</p>", "html.parser"))—— 虽然可行,但会创建冗余嵌套文档,且易引发编码/解析异常。 - 输出时务必用
encoding="utf-8"打开文件,并确认编辑器/浏览器以 UTF-8 解析 HTML(建议在中添加<meta charset="UTF-8">)。
总结:将 HTML 字符串“注入”为真实节点,核心在于脱离字符串上下文,进入 DOM 对象上下文——new_tag() 是最安全、标准、可维护的解决方案。
前端入门到VUE实战笔记:立即使用
在学习笔记中,你将探索 前端 的入门与实战技巧!










