如何在HTML中分组匹配多个class为caja-anuncio的section节点?
如何批量提取HTML中指定结构的section节点?
问题场景
现有一段包含多个重复结构的HTML,需要提取所有符合以下特征的section节点:
- 带有
id="post-数字"属性 - 带有
class="caja-anuncio"属性
每个目标节点的结构为两层嵌套的section:
<section id="post-1149642" class="caja-anuncio "> <section class="foto"> ... OMITTED... </section> <section class="caja-datos"> ... OMITTED... </h5> </section> </section>
原正则的问题
你之前尝试的正则使用了贪婪匹配的(?s).*,会直接从第一个匹配的起始标签一直匹配到最后一个闭合标签,无法分割成单个的目标节点。
可行解决方案
方案1:改进正则表达式(适用于结构固定的场景)
使用非贪婪匹配限制匹配范围,确保每个匹配只对应一个目标节点:
(<section id="post-\d+" class="caja-anuncio\s*">((?s).*?)<\/section>\s*<\/section>)
(?s):让.可以匹配换行符,处理多行HTML.*?:非贪婪匹配,遇到第一个符合的闭合标签就停止- 末尾匹配两个
</section>,对应目标节点的两层嵌套结构
示例(Python):
import re html = """你的HTML内容""" # 提取完整的section节点 pattern = r'(<section id="post-\d+" class="caja-anuncio\s*">((?s).*?)<\/section>\s*<\/section>)' results = re.findall(pattern, html) for full_section, _ in results: print(full_section)
方案2:使用HTML解析器(更可靠,推荐)
正则处理HTML容易因结构变化失效,更推荐用专业的HTML解析库(比如Python的BeautifulSoup):
from bs4 import BeautifulSoup html = """你的HTML内容""" soup = BeautifulSoup(html, 'html.parser') # 筛选符合条件的section节点 target_sections = soup.find_all( 'section', id=lambda x: x and x.startswith('post-'), class_='caja-anuncio' ) # 输出每个节点的完整HTML for sec in target_sections: print(sec.prettify())
这种方法无需关心内部嵌套结构,只要外层标签符合条件就能精准提取,容错性更强。
内容的提问来源于stack exchange,提问作者Kiquenet
相关产品推荐
相关产品推荐

