Как я могу удалить «лишние» html-теги внутри объекта BeautifulSoup?
В примере
<html>
<body>
<div>
<div>
<div>
<div>
<div>
<div>
Close
</div>
</div>
</div>
</div>
</div>
<div>
<div>
<div style = "width:80px">
<div>
</div>
<div>
<button>
Close
</button>
</div>
</div>
</div>
</div>
</div>
<div>
</div>
</body>
</html>
как я могу удалить лишние теги <div> (лишние, поскольку они только добавляют в глубину, но не содержат никакой дополнительной информации или атрибутов) в следующую структуру:
<html>
<body>
<div>
Close
</div>
<div style = "width:80px">
<button>
Close
</button>
</div>
</body>
</html>
С точки зрения алгоритма графа, я пытаюсь объединить несколько узлов в дереве BeautifulSoup, которые не содержат ни строк, ни атрибутов.
Да, было бы здорово иметь как можно более общий фрагмент :)






Вы можете использовать unwrap() для замены любых div без атрибутов (т.е. div.attrs == {}) их дочерними элементами:
for div in soup.find_all('div'):
if not div.attrs:
div.unwrap()
Выход print(soup.prettify()):
<html>
<body>
<button>
Close
</button>
<div style = "width:80px">
<button>
Close
</button>
</div>
</body>
</html>
Для обновленного примера (см. комментарий) это будет:
for div in soup.find_all('div'):
if not div.attrs and div.div:
div.unwrap()
то есть удалить div, если у него нет атрибутов и если за ним следует другой div
большое спасибо! Я только что понял, что мой пример был не совсем правильным, и обновил вопрос. Извините за путаницу.
Я только что создал фрагмент кода, который, кажется, выполняет эту работу:
for x in reversed(soup()):
if not x.string and not x.attrs and len(x.findChildren(recursive=False)) <= 1:
x.unwrap()
reversed необходим, так как в противном случае пустые теги считаются одноуровневыми, что блокирует развертывание.
Просто чтобы убедиться, что ответ не слишком тесно связан с образцом html: у вас есть один элемент с текстом (
<button>) с одним предком, у которого есть атрибут, и еще один элемент без такого предка. Но возможно ли, что у текстового элемента есть два вложенных предка с атрибутами? Возможно ли, что элемент с атрибутом не имеет дочернего элемента с текстом?