You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.11 20:03:29