正则表达式去除html标签内容
描述:使用python的re库,对HTML字符串中的标签进行去除,只保留标签内的文本。
代码示例:
import re
text = '''
<div class="text-item clearfix">
<span class="lab">建筑年代</span>
<span class="rcont">2009年</span>
</div>
<div class="text-item clearfix">
<span class="lab">有无电梯</span>
<span class="rcont">有 </span>
</div>
<div class="text-item clearfix">
<span class="lab">产权性质</span>
<span class="rcont">
商品房
</span>
</div>
<div class="text-item clearfix">
<span class="lab">住宅类别</span>
<span class="rcont">
<a href="https://baike.fang.com/item/普通住宅/2049571" target="_blank" class="link_rk">普通住宅</a>
</span>
</div>
<div class="text-item clearfix">
<span class="lab">建筑结构</span>
<span class="rcont">
<a href="https://baike.fang.com/item/平层/12851737" target="_blank" class="link_rk">平层</a>
</span>
</div>
<div class="text-item clearfix">
<span class="lab">建筑类别</span>
<span class="rcont">
<a href="https://baike.fang.com/item/板楼/1536095" target="_blank" class="link_rk">板楼</a>
</span>
</div>
<div class="text-item clearfix">
<span class="lab">挂牌时间</span>
<span class="rcont">
2023-07-26
</span>
</div>
'''
result = {}
pattern = re.compile(r'<span class="lab">(.*?)<\/span>\s*<span class="rcont">([\s\S]*?)<\/span>')
matches = re.findall(pattern, text)
for match in matches:
print(match[1].strip())
key = match[0].strip()
value = re.sub(r'<[^>]+>', '', match[1]).strip()
result[key] = value
print(result) # 输出: {'产权性质': '商品房', '住宅类别': '普通住宅'}
分析text,提取目标
此text一共由7个<div></div>
组成,每个<div></div>
中有两个<span></span>
标签,而有些<span></span>
中还存在<a><\a>
标签。
我们希望提取出如下键值对:
{'建筑年代': '2009年', '有无电梯': '有', '产权性质': '商品房', '住宅类别': '普通住宅', '建筑结构': '平层', '建筑类别': '板楼', '挂牌时间': '2023-07-26'}
主要解释代码
pattern = re.compile(r'<span class="lab">(.*?)<\/span>\s*<span class="rcont">([\s\S]*?)<\/span>')
value = re.sub(r'<[^>]+>', '', match[1]).strip()
正则表达式分析
pattern = re.compile(r'<span class="lab">(.*?)<\/span>\s*<span class="rcont">([\s\S]*?)<\/span>')
正则表达式中的(.*?)
的含义
正则表达式中的(.*?)
是一个非贪婪模式的匹配,它用于匹配尽可能少的字符。
具体来说,正则表达式中的.
表示匹配除换行符外的任意字符,*
表示匹配前面的字符零次或多次。而?
则表示匹配尽可能少的字符。
因此,(.*?)
表示匹配任意字符,但尽可能少地匹配。在默认情况下,正则表达式的匹配是贪婪的,即尽可能多地匹配。但使用非贪婪模式的.*?
可以使匹配变得非贪婪,只匹配尽可能少的字符。
例如,对于字符串"abc123def456"
,如果使用正则表达式".*"
来匹配,它将匹配整个字符串,因为.*
会尽可能多地匹配字符。但如果使用非贪婪模式的".*?"
来匹配,它将只匹配到第一个字符"a"
,因为.*?
会尽可能少地匹配字符。
非贪婪模式的匹配在某些情况下非常有用,特别是在需要匹配最短的字符串或避免匹配过多字符时。
正则表达式中的([\s\S]*?)
的含义
正则表达式([\s\S]*?)
的含义是匹配任意字符(包括换行符)的最小序列,即匹配尽可能少的字符。
具体来说,正则表达式中的[\s\S]
表示匹配任意字符,包括空白字符(\s
)和非空白字符(\S
)。*
表示匹配前面的字符零次或多次。而?
则表示匹配尽可能少的字符。
因此,([\s\S]*?)
表示匹配任意字符的最小序列,但尽可能少地匹配。使用非贪婪模式的[\s\S]*?
可以避免匹配过多字符,包括换行符等。
例如,对于字符串"abc\ndef"
,如果使用正则表达式"[\s\S]*"
来匹配,它将匹配整个字符串,包括换行符。但如果使用非贪婪模式的"[\s\S]*?"
来匹配,它将只匹配到第一个字符"a"
,并停止匹配。
非贪婪模式的匹配在某些情况下非常有用,特别是在需要匹配最短的字符串或避免匹配过多字符时。使用[\s\S]*?
可以确保匹配到的内容包括换行符等特殊字符。
value = re.sub(r'<[^>]+>', '', match[1]).strip()
正则表达式<[^>]+>
的含义如下:
<
:匹配左尖括号 “<”。
[^>]+
:匹配除了右尖括号 “>” 之外的任意字符,“+” 表示匹配前面的表达式一次或多次。>
:匹配右尖括号 “>”。
综合起来,<[^>]+>
的正则表达式可以匹配一对尖括号之间的内容,也就是 HTML 标签。它可以用于去除文本中的 HTML 标签,将标签内容替换为空字符串(即去除标签)。
例如,对于字符串<p>Hello, <b>world</b>!</p>
,使用<[^>]+>
正则表达式进行匹配,将得到以下结果:
<p>
:匹配<p>
标签。<b>
:匹配<b>
标签。</b>
:匹配</b>
标签。</p>
:匹配</p>
标签。
使用这个正则表达式可以方便地去除 HTML 标签,只保留标签之间的纯文本内容。
re.sub()的含义
re.sub()
函数的作用是将目标字符串中所有与模式匹配的内容替换为指定的字符串、函数或者替换字符串的引用。
函数原型:
re.sub(pattern, repl, string, count=0, flags=0)
函数参数说明:
pattern
:要匹配的正则表达式模式。repl
:用于替换匹配到的内容的字符串、函数或者替换字符串的引用。string
:要进行替换操作的字符串。count
(可选):指定替换的次数,默认为0,表示替换所有匹配到的内容。flags
(可选):用于控制正则表达式的匹配方式,例如忽略大小写、多行匹配等。