Я хотел бы удалить часть моего объекта HTML супа, объединить их вместе и вернуть как один единственный объект супа.
Часть объекта HTML, которую я хочу удалить, - это все содержимое внутриspan
и div
теги, которые содержат определенное имя class
.
Пример HTML похож на следующий: обратите внимание, что они находятся в списке tag
объектов:
body = [
<div class="content-block">
<p>Some text</p>
</div>
,
<div class="content-block>
<p style="margin-left:30px;">Some content here</p>
<span class="special_class"> //Remove
<a class="explanations-link"></a> //Remove
... //Remove
</span> //Remove
</div>
,
<div class="content-block>
<p style="margin-left:30px;">Some content here</p>
<div class="special_class"> //Remove
<p>Some content here</p> //Remove
... //Remove
</span> //Remove
</div>
]
Я хотел бы удалить все внутри тегов span
и div
, которые содержат имя класса special_class
, как выделено.
Моя текущая реализация зацикливается на каждом tag
объекте и преобразуетих в str
, а затем сделать replace
.После replace
я объединяю их вместе как str
.Оказывается, что replace
не удалил ни один из этих тегов, несмотря на их совпадение.
text_str = ""
for item in body:
item_str = str(item)
span_class_items = item.findAll("span", {"class": "special_class"})
div_class_items = item.findAll("div", {"class": "special_class"})
for i in span_class_items:
item_str.replace(str(i), "")
for d in div_class_items:
item_str.replace(str(d), "")
text_str += item_str
new_soup = BeautifulSoup(text_str, "html.parser")
Кроме того, после синтаксического анализа text_str
обратно в объект soup
возвращенный объект не является1 одиночный soup
объект, но все же len
количество элементов в списке body
.
Что я пропустил?
РЕДАКТИРОВАТЬ:
Попытка при использовании extract()
for item in body:
span_class_items = item.findAll("span", {"class": "legend-block explanations"})
div_class_items = item.findAll("div", {"class": "explanations-fancybox"})
test_item = item
if len(span_class_items) > 0:
for s_item in span_class_items:
test_item.s_item.extract()
if len(div_class_items) > 0:
for d_item in div_class_items:
test_item.d_item.extract()
Эта попытка выдает
'NoneType' object has no attribute 'extract'
Попытка при использовании replace_with()
for item in body:
span_class_items = item.findAll("span", {"class": "legend-block explanations"})
div_class_items = item.findAll("div", {"class": "explanations-fancybox"})
test_item = item
if len(span_class_items) > 0:
for s_item in span_class_items:
test_item.replace_with(s_item)
if len(div_class_items) > 0:
for d_item in div_class_items:
test_item.replace_with(d_item)
Эта попытка выдает
Cannot replace one element with another when the element to be replaced is not part of a tree.