Как я могу удалить теги комментариев из 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() //-->

2 ответов


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

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

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

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