我正在处理一些包含大量空标记的旧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>
我希望看到此调用的输出完全为空。
答案 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>