BeautifulSoup - 获取无HTML内容的简便方法
我正在使用这段代码来查找页面中所有有趣的链接:
soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+'))
这段代码的效果还不错。不过,在那个a标签里面,有很多嵌套的标签,比如font、b等各种各样的东西……我只想要里面的文本内容,不想要任何其他的html标签。
链接的例子是:
<A HREF="notizia.php?idn=1134" OnMouseOver="verde();" OnMouseOut="blu();"><FONT CLASS="v12"><B>03-11-2009: <font color=green>CCS Ingegneria Elettronica-Sportello studenti ed orientamento</B></FONT></A>
当然,这样看起来很乱(而且标签的格式也不总是一样!)我想要得到的是:
03-11-2009: CCS Ingegneria Elettronica-Sportello studenti ed orientamento
在文档里说要在findAll方法中使用text=True
,但这样会忽略我的正则表达式。为什么会这样呢?我该怎么解决这个问题?
2 个回答
2
你对用pyparsing来解决这个问题感兴趣吗?
from pyparsing import makeHTMLTags, SkipTo, anyOpenTag, anyCloseTag, ParseException
htmlsrc = """<A HREF="notizia.php?idn=1134" OnMouseOver="verde();" OnMouseOut="blu();"><FONT CLASS="v12"><B>03-11-2009: <font color=green>CCS Ingegneria Elettronica-Sportello studenti ed orientamento</B></FONT></A>"""
# create pattern to find interesting <A> tags
aStart,aEnd = makeHTMLTags("A")
def matchInterestingHrefsOnly(t):
if not t.href.startswith("notizia.php?"):
raise ParseException("not interested...")
aStart.setParseAction(matchInterestingHrefsOnly)
patt = aStart + SkipTo(aEnd)("body") + aEnd
# create pattern to strip HTML tags, and convert HTML entities
stripper = anyOpenTag.suppress() | anyCloseTag.suppress()
def stripTags(s):
s = stripper.transformString(s)
s = s.replace(" "," ")
return s
for match in patt.searchString(htmlsrc):
print stripTags(match.body)
输出结果是:
03-11-2009: CCS Ingegneria Elettronica-Sportello studenti ed orientamento
这个方法其实对HTML的一些变化非常不敏感,因为它考虑了属性的有无、大小写等因素。
13
我用过这个:
def textOf(soup):
return u''.join(soup.findAll(text=True))
所以……
texts = [textOf(n) for n in soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+'))]