删除特定深度以上的所有子标签

2 投票
2 回答
3178 浏览
提问于 2025-04-18 00:46

我们先来看一个简单的HTML示例。假设我们想要删除所有深度超过2层的子节点,也就是只保留前两层的内容,然后再进行截断和删除。

<html>
<head>
    <title></title>
    <meta />
    <meta />
    <link />
</head>
<body>
    <div>
        <div>
            <a></a>
            <a></a>
            <a></a>
        </div>
        <span>
            <h1>
                <li></li>
                <li></li>
            </h1>
        </span>
    </div>
</body>

这样处理后,结果可能会变成这样:

    <html>
<head>
    <title></title>
    <meta />
    <meta />
    <link />
</head>
<body>
    <div>
        <div></div>
        <span></span>
    </div>
</body>

2 个回答

1

也许可以这样做:

for child in body.children:
    for element in child.children:
        element.clear()
2

这个想法是递归地遍历所有元素,并逐层向上计数父元素:

from bs4 import BeautifulSoup
from urllib2 import urlopen


data = """your html goes here"""

depth = 5
soup = BeautifulSoup(data)
for tag in soup.find_all():
    if len(list(tag.parents)) == depth:
        tag.extract()

print soup.prettify()

输出结果是:

<html>
 <head>
  <title>
  </title>
  <meta/>
  <meta/>
  <link/>
 </head>
 <body>
  <div>
   <div></div>
   <span></span>
  </div>
 </body>
</html>

撰写回答