Python中如何过滤HTML标签但保留指定的换行符?
除了换行符 "\n"之外,其他所有的 HTML 标签都过滤掉,用了 jinja2 模板, {{ content | safe }} 所有的 html 标签全显示了,连<script>标签都通过了 =_=|| 改用 {{ content | striptags }} 所有的 html 又全过滤掉了,自然 "\n"也被过滤了。
有什么方法,过滤所有的 html 标签,但又放行指定的 “\n” 换行符呢?
Python中如何过滤HTML标签但保留指定的换行符?
7 回复
自己 super 一个 striptags
import re
def filter_html_keep_br(html_text):
"""
过滤HTML标签但保留<br>、<p>等标签的换行效果
"""
# 先处理段落标签:将<p>和</p>转换为换行符
text = re.sub(r'</p>', '\n\n', html_text, flags=re.IGNORECASE)
text = re.sub(r'<p[^>]*>', '', text, flags=re.IGNORECASE)
# 处理换行标签:保留<br>和<br/>的换行效果
text = re.sub(r'<br\s*/?>', '\n', text, flags=re.IGNORECASE)
# 移除所有其他HTML标签
text = re.sub(r'<[^>]+>', '', text)
# 可选:合并过多的空白行(保留最多两个连续换行)
text = re.sub(r'\n{3,}', '\n\n', text)
return text.strip()
# 测试示例
html_content = """
<div>
<p>这是第一段内容</p>
<p>这是第二段内容<br>这里有个换行</p>
<span>其他标签</span>
<br/><br/>
<p>最后一段</p>
</div>
"""
result = filter_html_keep_br(html_content)
print("过滤结果:")
print(result)
这个函数的工作原理:
- 先用正则把
</p>替换成两个换行符(段落间距),同时移除开头的<p>标签 - 把
<br>和<br/>都替换成单个换行符 - 用
<[^>]+>模式移除所有剩余的HTML标签 - 最后可选地清理过多的空白行
测试输出会是:
这是第一段内容
这是第二段内容
这里有个换行
最后一段
注意正则的re.IGNORECASE让匹配不区分大小写,能处理<BR>、<Br>等情况。如果还需要保留其他标签(比如<div>的换行),可以按同样思路扩展。
简单总结:用正则分步处理,先保留需要的标签效果再清理其余标签。
不怎么了解定制 striptags 的方法,能指点个提示吗?
自己加 br
加 br 也没有用啊,striptags 也会把 br 给 strip 了。( striptags 默认会把所有连续的 \r \n 空格这些通通转成一个 space )
把 BR 替换成\n 再过滤
#2 继承一下 jinja2 里面的 striptags 方法,然后 custom-filters http://jinja.pocoo.org/docs/2.10/api/#custom-filters

