MER*_*ose 7 html python 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")
Run Code Online (Sandbox Code Playgroud)
甚至.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>
Run Code Online (Sandbox Code Playgroud)
我希望看到此调用的输出完全为空。
这是一种删除空标签的方法:
>>> empty_tags = soup.findAll(lambda tag: tag.string is None)
>>> [empty_tag.extract() for empty_tag in empty_tags]
>>> print(soup.prettify())
Run Code Online (Sandbox Code Playgroud)
输出为空。
如果您只想删除真正的空标签(如)<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())
Run Code Online (Sandbox Code Playgroud)
输出:
<i style="mso-bidi-font-style:normal">
<span style="font-size:11.0pt;font-family:
Univers;mso-bidi-font-family:Arial">
</span>
</i>
Run Code Online (Sandbox Code Playgroud)
如果您只关注文本元素,那么以下方法呢?这实际上取决于您要保留什么结构。
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)
Run Code Online (Sandbox Code Playgroud)
给予:
<html><body>
<i>hello world</i>
</body></html>
Run Code Online (Sandbox Code Playgroud)
注意:这将删除所有不包含文本的元素,例如图像。
这里的现有答案有一个小问题,因为它们都删除了<br>始终为空但对于HTML结构至关重要的元素。
休息一下
[x.decompose() for x in soup.findAll(lambda tag: not tag.contents and not tag.name == 'br' )]
Run Code Online (Sandbox Code Playgroud)
资源
<p><p></p><strong>some<br>text<br>here</strong></p>
Run Code Online (Sandbox Code Playgroud)
输出量
<p><strong>some<br>text<br>here</strong></p>
Run Code Online (Sandbox Code Playgroud)
还要删除充满空格的元素
另外,如果您还想删除仅包含空格的标签,则可能需要执行以下操作
[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' )]
Run Code Online (Sandbox Code Playgroud)
资源
<p><p> </p><p></p><strong>some<br>text<br>here</strong></p>
Run Code Online (Sandbox Code Playgroud)
输出量
<p><strong>some<br>text<br>here</strong></p>
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
4736 次 |
| 最近记录: |