在HTML中,许多标签都有一个开头标签和结尾标签。这样的标签主要用于定义格式属性,例如<b>
和</b>
,<h1>
和</h1>
等。也有一些自闭合标签,它们没有闭合标签且没有任何文本部分,例如<img>
,<br>
,<input>
等。然而,在编写HTML时,可能会无意间插入像<p></p>
这样的没有任何文本的标签。我们需要借助Beautiful Soup库的功能来移除这种空标签。
移除没有任何文本的标签是容易的。如果一个标签的内部文本长度为0,你可以对该标签调用extract()
方法。
for tag in tags:
if (len(tag.get_text(strip=True)) == 0):
tag.extract()
然而,这样做会移除像<hr>
、<img>
和<input>
这样的自闭合标签或单例标签。即使没有与其相关的文本,你也可能不想移除那些带有一个或多个属性的标签。所以,你需要检查一个标签是否有属性并且get_text()
是否返回空。
在下面的例子中,存在两种情况:一个是空的文本标签,另一个是一些单例标签存在于HTML字符串中。代码保留了带有属性的标签,但移除了那些没有任何嵌入文本的标签。
示例
html = '''
<html>
<body>
<p>Paragraph</p>
<embed type="image/jpg" src="Python logo.jpg" width="300" height="200">
<hr>
<b></b>
<p>
<a href="#">Link</a>
<ul>
<li>One</li>
</ul>
<input type="text" id="fname" name="fname">
<img src="img_orange_flowers.jpg" alt="Flowers">
</body>
'''
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
tags = soup.find_all()
for tag in tags:
if (len(tag.get_text(strip=True)) == 0):
if len(tag.attrs) == 0:
tag.extract()
print(soup)
输出
<html>
<body>
<p>Paragraph</p>
<embed height="200" src="Python logo.jpg" type="image/jpg" width="300"/>
<p>
<a href="#">Link</a>
<ul>
<li>One</li>
</ul>
<input id="fname" name="fname" type="text"/>
<img alt="Flowers" src="img_orange_flowers.jpg"/>
</p>
</body>
</html>
请注意,原始的HTML代码中有一个没有闭合</p>
的<p>
标签。解析器会自动插入闭合标签。如果将解析器改为lxml或html5lib,闭合标签的位置可能会发生变化。
Print Page