一尘不染

如何使用BeautifulSoup从HTML剥离注释标签?

python

我一直在玩BeautifulSoup,这很棒。我的最终目标是尝试仅从页面获取文本。我只是想从正文中获取文本,有一种特殊情况是从<a><img>标签中获取标题和/或alt属性。

到目前为止,我有这个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() //-->

阅读 283

收藏
2020-12-20

共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
2020-12-20