如何删除没有内容的标签

时间:2015-11-03 13:53:26

标签: python html beautifulsoup

我正在处理一些包含大量空标记的旧HTML:<i style='mso-bidi-font-style:normal'><span style='font-size:11.0pt;font-family: Univers;mso-bidi-font-family:Arial'><o:p></o:p></span></i>。这严重破坏了我用来遍历树的算法。

有没有办法在遍历它之前清理BeautifulSoup对象?

from bs4 import BeautifulSoup

html_object = """
<i style='mso-bidi-font-style:normal'><span style='font-size:11.0pt;font-family:
Univers;mso-bidi-font-family:Arial'><o:p></o:p></span></i>
"""
soup = BeautifulSoup(html_object, "lxml")

.prettify()甚至无法移除空标记:

>>> print(soup.prettify())
<html>
 <body>
  <i style="mso-bidi-font-style:normal">
   <span style="font-size:11.0pt;font-family:
  Univers;mso-bidi-font-family:Arial">
    <o:p>
    </o:p>
   </span>
  </i>
 </body>
</html>

我希望看到此调用的输出完全为空。

3 个答案:

答案 0 :(得分:3)

以下是一种删除标记的方法:

>>> empty_tags = soup.findAll(lambda tag: tag.string is None)
>>> [empty_tag.extract() for empty_tag in empty_tags]
>>> print(soup.prettify())

输出为空。

如果您只想删除真正空标记,如<o:p></o:p>,另一种方式:

>>> empty_tags = soup.findAll(lambda tag: not tag.contents)
>>> [empty_tag.extract() for empty_tag in empty_tags]
>>> print(soup.prettify())

输出:

<i style="mso-bidi-font-style:normal">
 <span style="font-size:11.0pt;font-family:
Univers;mso-bidi-font-family:Arial">
 </span>
</i>

答案 1 :(得分:3)

如果您只关注文本元素,那么以下方法如何?这实际上取决于你想要保留的结构。

from bs4 import BeautifulSoup

html_object = """
<i style='mso-bidi-font-style:normal'><span style='font-size:11.0pt;font-family:
Univers;mso-bidi-font-family:Arial'><o:p></o:p></span></i>
<i>hello world</i>
"""
soup = BeautifulSoup(html_object, "lxml")

for x in soup.find_all():
    if len(x.get_text(strip=True)) == 0:
        x.extract()

print(soup)

,并提供:

<html><body>
<i>hello world</i>
</body></html>

注意:这将删除所有不包含文本的元素,例如图像。

答案 2 :(得分:0)

这里的现有答案有一个小问题,因为它们都删除了<br>元素,该元素始终为空,但对HTML的结构至关重要。

保留所有休息时间

 [x.decompose() for x in soup.findAll(lambda tag: not tag.contents and not tag.name == 'br' )]

来源

<p><p></p><strong>some<br>text<br>here</strong></p>

输出

<p><strong>some<br>text<br>here</strong></p>

还删除充满空格的元素

如果您还想删除仅包含空格的标记,则可能需要执行类似的操作

[x.decompose() for x in soup.findAll(lambda tag: (not tag.contents or len(tag.get_text(strip=True)) <= 0) and not tag.name == 'br' )]

来源

<p><p>    </p><p></p><strong>some<br>text<br>here</strong></p>

输出

<p><strong>some<br>text<br>here</strong></p>