Usando el módulo Beautiful Soup Python para reemplazar etiquetas con texto plano

estoy usandoHermosa sopa Para extraer 'contenido' de las páginas web. Sé que algunas personas han preguntado estopregunta antes y todos apuntaban a Beautiful Soup y así es como comencé a hacerlo.

Pude obtener la mayoría del contenido con éxito, pero me estoy topando con algunos desafíos con etiquetas que forman parte del contenido. (Estoy empezando con una estrategia básica de: si hay más de x-caracteres en un nodo, entonces es contenido). Tomemos el código html a continuación como ejemplo:

<div id="abc">
    some long text goes <a href="/"> here </a> and hopefully it 
    will get picked up by the parser as content
</div>

results = soup.findAll(text=lambda(x): len(x) > 20)

Cuando uso el código anterior para obtener el texto largo, se rompe (el texto identificado empezará desde 'y con suerte ...') en las etiquetas. Así que traté de reemplazar la etiqueta con texto plano de la siguiente manera:

anchors = soup.findAll('a')

for a in anchors:
  a.replaceWith('plain text')

Lo anterior no funciona porque Beautiful Soup inserta la cadena como NavigableString y eso causa el mismo problema cuando uso findAll con la len (x)> 20. Puedo usar expresiones regulares para analizar el html como texto sin formato primero, borre todo Las etiquetas no deseadas y luego llamar a Beautiful Soup. Pero me gustaría evitar procesar el mismo contenido dos veces; estoy tratando de analizar estas páginas para poder mostrar un fragmento de contenido de un enlace determinado (muy parecido a Facebook Share), y si todo se hace con Beautiful Soup, Supongo que será más rápido.

Entonces, mi pregunta: ¿hay una manera de 'borrar etiquetas' y reemplazarlas con 'texto simple' usando Beautiful Soup. Si no, ¿cuál será la mejor manera de hacerlo?

Gracias por tus sugerencias!

Actualizar:&nbsp;El código de Alex funcionó muy bien para el ejemplo de muestra. También probé varios casos de borde y todos funcionaron bien (con la modificación a continuación). Así que lo intenté en un sitio web de la vida real y me encontré con problemas que me intrigan.

import urllib
from BeautifulSoup import BeautifulSoup

page = urllib.urlopen('http://www.engadget.com/2010/01/12/kingston-ssdnow-v-dips-to-30gb-size-lower-price/')

anchors = soup.findAll('a')
i = 0
for a in anchors:
    print str(i) + ":" + str(a)
    for a in anchors:
        if (a.string is None): a.string = ''
        if (a.previousSibling is None and a.nextSibling is None):
            a.previousSibling = a.string
        elif (a.previousSibling is None and a.nextSibling is not None):
            a.nextSibling.replaceWith(a.string + a.nextSibling)
        elif (a.previousSibling is not None and a.nextSibling is None):
            a.previousSibling.replaceWith(a.previousSibling + a.string)
        else:
            a.previousSibling.replaceWith(a.previousSibling + a.string + a.nextSibling)
            a.nextSibling.extract()
    i = i+1

Cuando ejecuto el código anterior, obtengo el siguiente error:

0:<a href="http://www.switched.com/category/ces-2010">Stay up to date with 
Switched's CES 2010 coverage</a>
Traceback (most recent call last):
  File "parselink.py", line 44, in <module>
  a.previousSibling.replaceWith(a.previousSibling + a.string + a.nextSibling)
 TypeError: unsupported operand type(s) for +: 'Tag' and 'NavigableString'

Cuando miro el código HTML, 'Manténgase actualizado ... "no tiene ningún hermano anterior (no sabía cómo funcionaba el hermano anterior hasta que vi el código de Alex y, según mis pruebas, parece que está buscando' texto ' antes de la etiqueta). Por lo tanto, si no hay un hermano anterior, me sorprende que no esté pasando por la lógica if de un .perniousSibling is None y a; nextSibling is None.

¿Podría por favor hacerme saber lo que estoy haciendo mal?

-cognium