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>
Ответы
Ответ 1
Вы можете использовать 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>
Ответ 2
Обычно изменение дерева разбора 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()
Ответ 3
Из этого ответа Если вы ищете решение в BeautifulSoup версии 3 BS3 Docs - Комментарий
soup = BeautifulSoup("""Hello! <!--I've got to be nice to get what I want.-->""")
comment = soup.find(text=re.compile("if"))
Comment=comment.__class__
for element in soup(text=lambda text: isinstance(text, Comment)):
element.extract()
print soup.prettify()