Python正则提取嵌套HTML最内层div内容遇阻求助
问题:用Python正则提取嵌套div最内层内容失败
尝试用Python的re模块解析嵌套HTML结构时,卡在正则模式上,没法提取最内层div的内容。现有代码如下:
import re html_text = """ <div> <div> <div> Innermost Content 1 </div> </div> <div> Innermost Content 2 </div> </div> """ pattern = r'<div>(.*?)</div>' result = re.findall(pattern, html_text, re.DOTALL) print(result)
预期返回最内层div的内容:
['Innermost Content 1', 'Innermost Content 2']
但实际结果不符,请问正则模式有什么问题?怎么修正?
分析与解决
问题所在
你的正则r'<div>(.*?)</div>'用了非贪婪匹配,但无法区分嵌套层级:
- 非贪婪匹配会从第一个
<div>开始,找到最近的</div>就结束匹配,所以第一次匹配会拿到外层div里的所有嵌套内容(包括中间的<div>标签),而不是最内层的内容。 - 实际运行结果会是包含大量空白和嵌套标签的字符串列表,完全不符合预期。
修正方案
正则本身不擅长处理嵌套结构,但可以通过匹配不包含<div>的内容来定位最内层div:
方案1:正则匹配最内层div
调整正则模式,匹配那些内部不再包含<div>标签的div元素:
import re html_text = """ <div> <div> <div> Innermost Content 1 </div> </div> <div> Innermost Content 2 </div> </div> """ # 匹配内部不含<div>的div标签,同时去除前后空白 pattern = r'<div>(?!.*<div>)(.*?)</div>' result = [re.sub(r'\s+', ' ', content).strip() for content in re.findall(pattern, html_text, re.DOTALL)] print(result)
运行结果:
['Innermost Content 1', 'Innermost Content 2']
(?!.*<div>)是负向预查,确保当前<div>内部不会再出现<div>标签,也就是只匹配最内层的div。- 最后用
re.sub和strip()清理内容里的多余空白。
方案2:用HTML解析库(推荐)
正则处理HTML天生有局限性,嵌套结构复杂时更易出错,推荐用专门的HTML解析库比如BeautifulSoup:
from bs4 import BeautifulSoup html_text = """ <div> <div> <div> Innermost Content 1 </div> </div> <div> Innermost Content 2 </div> </div> """ soup = BeautifulSoup(html_text, 'html.parser') # 找到所有没有子div的div标签(最内层) innermost_divs = [div for div in soup.find_all('div') if not div.find('div')] result = [div.get_text(strip=True) for div in innermost_divs] print(result)
运行结果同样符合预期,而且代码可读性更强,能应对更复杂的HTML结构。
内容的提问来源于stack exchange,提问作者prabu naresh
相关产品推荐
相关产品推荐

