BeautifulSoup: una forma fácil de obtener contenidos sin HTML

Estoy usando este código para encontrar todos los enlaces interesantes en una página:

soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+')) 

Y hace su trabajo bastante bien. Desafortunadamente, dentro de esa etiqueta hay muchas tags anidadas, como fonts , letras y cosas diferentes … Me gustaría obtener solo el contenido del texto, sin ninguna otra etiqueta html.

Ejemplo de enlace:

 03-11-2009:  CCS Ingegneria Elettronica-Sportello studenti ed orientamento 

Por supuesto que es feo (¡y el marcado no siempre es el mismo!) Y me gustaría obtener:

 03-11-2009: CCS Ingegneria Elettronica-Sportello studenti ed orientamento 

En la documentación dice que se debe usar text=True en el método findAll, pero ignorará mi expresión regular. ¿Por qué? ¿Cómo puedo resolver eso?

He usado esto:

 def textOf(soup): return u''.join(soup.findAll(text=True)) 

Asi que…

 texts = [textOf(n) for n in soup.findAll('a', href=re.compile('^notizia.php\?idn=\d+'))] 

¿Interesado en una toma de pyparsing en el problema?

 from pyparsing import makeHTMLTags, SkipTo, anyOpenTag, anyCloseTag, ParseException htmlsrc = """03-11-2009:  CCS Ingegneria Elettronica-Sportello studenti ed orientamento""" # create pattern to find interesting  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) 

Huellas dactilares:

 03-11-2009: CCS Ingegneria Elettronica-Sportello studenti ed orientamento 

En realidad, esto es bastante impermeable a los caprichos de HTML, ya que tiene en cuenta la presencia / ausencia de atributos, mayúsculas / minúsculas, etc.