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)

这个函数的工作原理:

  1. 先用正则把</p>替换成两个换行符(段落间距),同时移除开头的<p>标签
  2. <br><br/>都替换成单个换行符
  3. <[^>]+>模式移除所有剩余的HTML标签
  4. 最后可选地清理过多的空白行

测试输出会是:

这是第一段内容

这是第二段内容
这里有个换行

最后一段

注意正则的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

回到顶部