Beautifulsoup 4: Удалить тег комментариев и его содержимое

Итак, страница, которую я отбрасываю, содержит эти html-коды. Как удалить тег комментария <!-- --> вместе с его содержанием с bs4?

<div class="foo">
cat dog sheep goat
<!-- 
<p>NewPP limit report
Preprocessor node count: 478/300000
Post‐expand include size: 4852/2097152 bytes
Template argument size: 870/2097152 bytes
Expensive parser function count: 2/100
ExtLoops count: 6/100
</p>
-->

</div>

2 ответов


можно использовать extract() (решение ответ):

PageElement.extract () удаляет тег или строку из дерева. Он возвращает извлеченный тег или строку.

from bs4 import BeautifulSoup, Comment

data = """<div class="foo">
cat dog sheep goat
<!--
<p>test</p>
-->
</div>"""

soup = BeautifulSoup(data)

div = soup.find('div', class_='foo')
for element in div(text=lambda text: isinstance(text, Comment)):
    element.extract()

print soup.prettify()

в результате вы получаете свой div без комментариев:

<div class="foo">
    cat dog sheep goat
</div>

обычно изменения bs4 дерево разбора является ненужным. Вы можете просто получить текст div, если это то, что вы хотели:

soup.body.div.text
Out[18]: '\ncat dog sheep goat\n\n'

bs4 отделяет комментарий. Однако, если вам действительно нужно изменить дерево синтаксического анализа:

from bs4 import Comment

for child in soup.body.div.children:
    if isinstance(child,Comment):
        child.extract()