Как отключить теги комментариев из HTML с помощью BeautifulSoup?

Я играю с BeautifulSoup, и это здорово. Моя конечная цель - попытаться просто получить текст со страницы. Я просто пытаюсь получить текст из тела, со специальным случаем, чтобы получить заголовки и/или атрибуты 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() //-->

Ответ 1

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

Это может быть проблемой с базовым синтаксическим анализатором 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

Ответ 2

Прямо из документации для 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

Если вы ищете решение в 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()




a=[5,5,6,8,2,8,4,7,1,0]

для j, я в перечислении (a): если j% 2: если i% 2 == 0: для d в диапазоне (j, len (a)): если a [j]% 2 == 0: a [j ], а [d] = а [d], а [J]

else:
    if i%2:
        for d in range(j,len(a)):
            if a[j]%2:
                a[j],a[d]=a[d],a[j]

печать (а, "является результатом")