Python3 BeautifulSoup: удалить часть HTML и вернуть как суп-объект - PullRequest
0 голосов
/ 19 сентября 2019

Я хотел бы удалить часть моего объекта 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.

1 Ответ

0 голосов
/ 19 сентября 2019

Вы можете попробовать использовать метод degpose (), он позволяет уничтожить тег из дерева, вот пример

markup = '<a href="http://example.com/">I linked to <i>example.com</i></a>'
soup = BeautifulSoup(markup)
a_tag = soup.a

soup.i.decompose()

a_tag
# <a href="http://example.com/">I linked to</a>

Более подробную информацию вы можете найти здесь https://www.crummy.com/software/BeautifulSoup/bs4/doc/#decompose

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...