如何在Django中将HTML模板渲染为不含标签的纯文本?
Django HTML转纯文本实现方案
Django本身没有内置专门实现类lynx效果的HTML转纯文本的机制,但可以通过以下几种方案快速实现需求:
方案1:内置striptags工具(仅适合简单场景)
- 特点:Django自带无需额外依赖,仅能剥离所有HTML标签,不会保留块级元素的换行格式
- 用法:
- 模板中使用:
{{ html_content|striptags }} - Python代码中使用:
from django.utils.html import strip_tags plain_text = strip_tags("<h1>Title</h1><p>Paragraph</p>") - 模板中使用:
- 缺陷:你的示例输入处理后会得到
TitleParagraph,丢失换行,不符合需求。
方案2:基于BeautifulSoup自定义实现(可控性高)
- 特点:可自定义块级元素的换行规则,满足基础的格式保留需求,效果符合你的示例要求
- 前置依赖:安装
beautifulsoup4库 - 代码实现:
from bs4 import BeautifulSoup import re def html_to_plain_text(html): soup = BeautifulSoup(html, "html.parser") # 给所有块级元素后追加换行 block_tags = ["h1", "h2", "h3", "h4", "h5", "h6", "p", "div", "li", "br", "hr"] for tag in block_tags: for element in soup.find_all(tag): element.insert_after("\n") # 提取纯文本 plain_text = soup.get_text() # 清理多余空行 plain_text = re.sub(r"\n\s*\n", "\n\n", plain_text).strip() return plain_text
- 效果:你的示例输入调用后输出为:
Title Paragraph
方案3:使用html2text库(效果最接近lynx浏览器)
- 特点:专门用于HTML转Markdown风格纯文本,自动处理列表符号、链接、图片等元素,完全满足邮件纯文本替代版本的需求
- 前置依赖:安装
html2text库 - 代码实现:
import html2text def html_to_plain_text(html): converter = html2text.HTML2Text() # 自定义配置 converter.ignore_links = False # 设为True则忽略链接,仅保留链接文本 converter.ignore_images = True converter.body_width = 0 # 取消自动换行限制 return converter.handle(html).strip()
邮件场景最佳实践
Django发送多格式邮件时,使用EmailMultiAlternatives类分别附加HTML版本和纯文本版本即可:
from django.core.mail import EmailMultiAlternatives subject = "邮件主题" from_email = "sender@example.com" to = ["recipient@example.com"] text_content = "你生成的纯文本内容" html_content = "你的HTML邮件内容" msg = EmailMultiAlternatives(subject, text_content, from_email, to) msg.attach_alternative(html_content, "text/html") msg.send()
内容的提问来源于stack exchange,提问作者user11632619
相关产品推荐
相关产品推荐

