如果我有这样的 html 片段:
<p><br><p>
<li>stuff</li>
<li>stuff</li>
有没有办法清理这个并使用 beautiful soup 添加缺少的 ul/ol 标签,或另一个Python库?
我尝试了 soup.prettify()
但它保持原样。
最佳答案
似乎没有一个内置方法可以将 li
元素组包装到 ul
中。但是,您可以简单地循环 li
元素,识别每个 li
组的第一个元素并将其包装在 ul
标记中。该组中的下一个元素将附加到之前创建的 ul
中:
from bs4 import BeautifulSoup
soup = BeautifulSoup(html, "html.parser")
ulgroup = 0
uls = []
for li in soup.findAll('li'):
previous_element = li.findPrevious()
# if <li> already wrapped in <ul>, do nothing
if previous_element and previous_element.name == 'ul':
continue
# if <li> is the first element of a <li> group, wrap it in a new <ul>
if not previous_element or previous_element.name != 'li':
ulgroup += 1
ul = soup.new_tag("ul")
li.wrap(ul)
uls.append(ul)
# append rest of <li> group to previously created <ul>
elif ulgroup > 0:
uls[ulgroup-1].append(li)
print(soup.prettify())
例如,输入以下内容:
html = '''
<p><br><p>
<li>stuff1</li>
<li>stuff2</li>
<div></div>
<li>stuff3</li>
<li>stuff4</li>
<li>stuff5</li>
'''
输出:
<p>
<br/>
<p>
<ul>
<li>
stuff1
</li>
<li>
stuff2
</li>
</ul>
<div>
</div>
<ul>
<li>
stuff3
</li>
<li>
stuff4
</li>
<li>
stuff5
</li>
</ul>
</p>
</p>
关于python-3.x - 如何使用 Python 和 Beautiful Soup 修复 html 列表片段中丢失的 ul 标签,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/55619920/