删除超过特定深度的所有子标记

时间:2014-04-01 03:34:16

标签: python html beautifulsoup lxml

以这样的基本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 个答案:

答案 0 :(得分:1)

我们的想法是递归迭代所有元素并倒数父母:

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>

答案 1 :(得分:0)

可能是这样的:

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