Сначала вы должны решить, какой синтаксический анализатор вы собираетесь использовать.Различные парсеры по-разному обрабатывают искаженный html .
Следующие методы BeautifulSoup помогут вам выполнить то, что вам нужно
new_tag () - создать новый тег ul
append () - Комудобавьте вновь созданный тег ul где-нибудь в дереве супа.
extract () - чтобы извлечь теги li
по одному(который мы можем добавить к тегу ul
)
декомпозировать () - удалить ненужные теги из дерева.Который может быть сформирован в результате интерпретации парсером искаженного html.
Мое решение
Давайте создадим объект супа, используя html5lib
парсер, и посмотрим, что мыget
from bs4 import BeautifulSoup
html="""
<p><br><p>
<li>stuff</li>
<li>stuff</li>
"""
soup=BeautifulSoup(html,'html5lib')
print(soup)
Выходы:
<html><head></head><body><p><br/></p><p>
</p><li>stuff</li>
<li>stuff</li>
</body></html>
Следующий шаг может варьироваться в зависимости от того, чего вы хотите достичь.Я хочу удалить второй пустой р.Добавьте новый тег ul
и получите все теги li
внутри него.
from bs4 import BeautifulSoup
html="""
<p><br><p>
<li>stuff</li>
<li>stuff</li>
"""
soup=BeautifulSoup(html,'html5lib')
second_p=soup.find_all('p')[1]
second_p.decompose()
ul_tag=soup.new_tag('ul')
soup.find('body').append(ul_tag)
for li_tag in soup.find_all('li'):
ul_tag.append(li_tag.extract())
print(soup.prettify())
Выходы:
<html>
<head>
</head>
<body>
<p>
<br/>
</p>
<ul>
<li>
stuff
</li>
<li>
stuff
</li>
</ul>
</body>
</html>