Verwenden des Python-Moduls "Schöne Suppe", um Tags durch einfachen Text zu ersetzen

ich benutzeSchöne Suppe 'Inhalt' von Webseiten zu extrahieren. Ich weiß, dass einige Leute dies gefragt habenFrage vor und sie wurden alle auf Beautiful Soup hingewiesen und so fing ich damit an.

Ich konnte den größten Teil des Inhalts erfolgreich abrufen, stoße jedoch auf einige Probleme mit Tags, die Teil des Inhalts sind. (Ich beginne mit einer grundlegenden Strategie: Wenn ein Knoten mehr als x-Zeichen enthält, ist er zufrieden.) Nehmen wir als Beispiel den folgenden HTML-Code:

<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)

Wenn ich den obigen Code verwende, um an den Langtext zu gelangen, wird er an den Tags unterbrochen (der identifizierte Text beginnt mit 'und hoffentlich ..'). Deshalb habe ich versucht, das Tag wie folgt durch einfachen Text zu ersetzen:

anchors = soup.findAll('a')

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

Das oben Genannte funktioniert nicht, da Beautiful Soup den String als NavigableString einfügt und dasselbe Problem verursacht, wenn ich findAll mit len ​​(x)> 20 verwende. Ich kann reguläre Ausdrücke verwenden, um den HTML-Code zuerst als Nur-Text zu analysieren die unerwünschten Tags und rufen Sie dann Beautiful Soup auf. Ich möchte jedoch vermeiden, denselben Inhalt zweimal zu verarbeiten. Ich versuche, diese Seiten zu analysieren, damit ich einen Inhaltsausschnitt für einen bestimmten Link anzeigen kann (ähnlich wie bei Facebook Share). Wenn alles mit Beautiful Soup erfolgt, Ich gehe davon aus, dass es schneller sein wird.

Meine Frage lautet also: Gibt es eine Möglichkeit, Tags mit Beautiful Soup zu "löschen" und durch "Nur-Text" zu ersetzen? Wenn nicht, wie geht das am besten?

Vielen Dank für Ihre Anregungen!

Aktualisieren:&nbsp;Alex 'Code hat für das Beispielbeispiel sehr gut funktioniert. Ich habe auch verschiedene Edge Cases ausprobiert und alle haben einwandfrei funktioniert (mit der Modifikation unten). Also habe ich es auf einer realen Website ausprobiert und bin auf Probleme gestoßen, die mich rätseln.

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

Wenn ich den obigen Code ausführe, wird folgende Fehlermeldung angezeigt:

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'

Wenn ich mir den HTML-Code ansehe, hat "Bleiben Sie auf dem Laufenden .." keine vorherigen Geschwister (ich habe nicht so gearbeitet, wie die vorherigen Geschwister gearbeitet haben, bis ich Alex 'Code gesehen habe und basierend auf meinen Tests sieht es so aus, als würde er nach "Text" suchen. Wenn es also kein vorheriges Geschwister gibt, bin ich überrascht, dass es nicht die if-Logik von a.previousSibling is None und a; nextSibling is None durchläuft.

Könnten Sie mir bitte mitteilen, was ich falsch mache?

-ecognium