Python 从字符串中删除 HTML 标记

使用 re.sub() 方法从字符串中删除 HTML 标签,例如 result = re.sub(r'<.*?>', '', html_string)re.sub() 方法将删除字符串中的所有 HTML 标记,将它们替换为空字符串。

import re

html_string = """
<div>
  <ul>
    <li>Apple</li>
    <li>Banana</li>
    <li>Kiwi</li>
  </ul>
</div>
"""

result = re.sub(r'<.*?>', '', html_string)

# Apple
# Banana
# Kiwi

print(result)

re.sub 方法返回一个新字符串,该字符串是通过用提供的替换替换模式的出现而获得的。

如果未找到该模式,则按原样返回字符串。

我们传递给 re.sub() 方法的第一个参数是一个正则表达式。

方括号 <> 匹配 HTML 标记的开始和结束字符。

. 匹配除换行符以外的任何字符。

星号 * 匹配前面字符(任何字符)的 0 次或多次重复。

添加问号 ? 在限定符使其执行非贪婪或最小匹配之后。

例如,使用正则表达式 <.*?> 将只匹配 <a>

总的来说,正则表达式匹配所有开始和结束 HTML 标记。

或者,我们可以使用 HTMLParser 类。

在 Python 中使用 HTMLParser 从字符串中删除 HTML 标签

在 Python 中从字符串中删除 HTML 标签:

  • 从 html.parser 模块的 HTMLParser 类扩展。
  • 实现 handle_data 方法来获取 HTML 标签之间的数据。
  • 将数据存储在类实例的列表中。
  • 在类的实例上调用 get_data() 方法。
from html.parser import HTMLParser


class HTMLTagsRemover(HTMLParser):
    def __init__(self):
        super().__init__(convert_charrefs=False)
        self.reset()
        self.convert_charrefs = True
        self.fed = []

    def handle_data(self, data):
        self.fed.append(data)

    def handle_entityref(self, name):
        self.fed.append(f'&{name};')

    def handle_charref(self, name):
        self.fed.append(f'&#{name};')

    def get_data(self):
        return ''.join(self.fed)


def remove_html_tags(value):
    remover = HTMLTagsRemover()

    remover.feed(value)
    remover.close()
    return remover.get_data()


html_string = """
<div>
  <ul>
    <li>Apple</li>
    <li>Banana</li>
    <li>Kiwi</li>
  </ul>
</div>
"""

# Apple
# Banana
# Kiwi
print(remove_html_tags(html_string))

我们从 HTMLParser 类扩展而来。 代码片段与 django 模块内部使用的代码片段非常相似。

HTMLParser 类用于查找标记和其他标记并调用处理函数。

HTML 标记之间的数据通过调用 self.handle_data() 从解析器传递到派生类。

convert_charrefs 设置为 True 时,字符引用会自动转换为相应的 Unicode 字符。

如果 convert_charrefs 设置为 False,则通过调用 self.handle_entityref()self.handle_charref() 方法传递字符引用。

get_data() 方法使用 str.join() 方法来连接字符串列表而无需分隔符。

str.join 方法将一个可迭代对象作为参数并返回一个字符串,该字符串是可迭代对象中字符串的串联。

remove_html_tags() 函数接受一个包含 HTML 标记的字符串,并返回一个新字符串,其中所有开始和结束 HTML 标记都已被删除。

def remove_html_tags(value):
    remover = HTMLTagsRemover()

    remover.feed(value)
    remover.close()
    return remover.get_data()


html_string = """
<div>
  <ul>
    <li>Apple</li>
    <li>Banana</li>
    <li>Kiwi</li>
  </ul>
</div>
"""

# Apple
# Banana
# Kiwi
print(remove_html_tags(html_string))

该函数实例化类并将包含 html 标记的字符串提供给解析器。

下一步是调用实例上的 close() 方法来处理任何缓冲的数据。

最后,我们在实例上调用 get_data() 方法将字符串列表连接成一个不包含任何 HTML 标记的字符串。

查看笔记

扫码一下
查看教程更方便