Как я могу удалить теги комментариев из HTML, используя BeautifulSoup? - PullRequest
13 голосов
/ 18 августа 2010

Я играл с BeautifulSoup, и это здорово.Моя конечная цель - попытаться получить текст со страницы.Я просто пытаюсь получить текст из тела, с особым случаем, чтобы получить атрибуты title и / или alt из тегов <a> или <img>.

Пока у меня есть это EDITED & UPDATED CURRENT CODE:

soup = BeautifulSoup(page)
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in comments]
page = ''.join(soup.findAll(text=True))
page = ' '.join(page.split())
print page

1) Что вы предлагаете для моего особого случая, чтобы НЕ исключать эти атрибуты из двух тегов, которые я перечислил выше?Если это слишком сложно сделать, это не так важно, как делать # 2.

2) Я бы хотел удалить теги <!-- --> и все, что находится между ними.Как бы я поступил так?

QUESTION EDIT @jathanism: Вот некоторые теги комментариев, которые я пытался удалить, но они остаются, даже когда я использую ваш пример

<!-- Begin function popUp(URL) { day = new Date(); id = day.getTime(); eval("page" + id + " = window.open(URL, '" + id + "', 'toolbar=0,scrollbars=0,location=0,statusbar=0,menubar=0,resizable=0,width=300,height=330,left = 774,top = 518');"); } // End -->
<!-- var MenuBar1 = new Spry.Widget.MenuBar("MenuBar1", {imgDown:"SpryAssets/SpryMenuBarDownHover.gif", imgRight:"SpryAssets/SpryMenuBarRightHover.gif"}); //--> <!-- var MenuBar1 = new Spry.Widget.MenuBar("MenuBar1", {imgDown:"SpryAssets/SpryMenuBarDownHover.gif", imgRight:"SpryAssets/SpryMenuBarRightHover.gif"}); //--> <!-- var whichlink=0 var whichimage=0 var blenddelay=(ie)? document.images.slide.filters[0].duration*1000 : 0 function slideit(){ if (!document.images) return if (ie) document.images.slide.filters[0].apply() document.images.slide.src=imageholder[whichimage].src if (ie) document.images.slide.filters[0].play() whichlink=whichimage whichimage=(whichimage<slideimages.length-1)? whichimage+1 : 0 setTimeout("slideit()",slidespeed+blenddelay) } slideit() //-->

Ответы [ 3 ]

58 голосов
/ 18 августа 2010

Прямо из документации для BeautifulSoup , вы можете легко удалить комментарии (или что-нибудь еще), используя extract():

from BeautifulSoup import BeautifulSoup, Comment
soup = BeautifulSoup("""1<!--The loneliest number-->
                        <a>2<!--Can be as bad as one--><b>3""")
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
[comment.extract() for comment in comments]
print soup
# 1
# <a>2<b>3</b></a>
3 голосов
/ 18 августа 2010

Я все еще пытаюсь понять, почему это не находит и не удаляет теги вот так: <!-- //-->. Эти обратные слеши вызывают некоторые теги должны быть пропущены.

Это может быть проблемой с базовым синтаксическим анализатором SGML: см. http://www.crummy.com/software/BeautifulSoup/documentation.html#Sanitizing%20Bad%20Data%20with%20Regexps. Вы можете переопределить его, используя markupMassage регулярное выражение - прямо из документов:

import re, copy

myMassage = [(re.compile('<!-([^-])'), lambda match: '<!--' + match.group(1))]
myNewMassage = copy.copy(BeautifulSoup.MARKUP_MASSAGE)
myNewMassage.extend(myMassage)

BeautifulSoup(badString, markupMassage=myNewMassage)
# Foo<!--This comment is malformed.-->Bar<br />Baz
0 голосов
/ 16 апреля 2019

Если вы ищете решение в BeautifulSoup версии 3 Документы BS3 - Комментарий

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()
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...