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 标记的字符串。