Zusammenfassung:
Ich suche einen Weg, den SoupStrainer von BeautifulSoup mit verschiedenen Ausschlussbedingungen auszustatten, so dass bei dem ersten Parsen nur die Elemente, die ich auch brauche in den Parse-tree aufgenommen werden.
Problembeschreibung:
ich bin dabei, ein Programm zu schreiben, mit dem ich verschiedene Informationen aus Wikipedia-Artikeln sammeln kann.
Wenn ich nur den unformatierten Text des Artikels auf einer Wikipedia Seite haben will, reicht es, wenn ich mich mit dem div-Element mit der id bodyContent beschäftige, da dieser den Artikel beinhaltet.
Dazu beschränke ich den Parser mit dem SoupStrainer (Klasse von BeautifulSoup) auf diesen div:
Code: Alles auswählen
bodyContent = SoupStrainer('div',id="bodyContent")
soup = BeautifulSoup(wikiseite, parseOnlyThese=bodyContent)
Code: Alles auswählen
# Kommentarelemente suchen:
comments = soup.findAll(text=lambda text:isinstance(text, Comment))
# Whitespaceelemente suchen:
lonelyWhitespaces = soup.findAll(text=re.compile(r"^\s+$"))
# Kommentare entfernen:
for comment in comments: comment.extract()
# Whitespaces entfernen:
for ws in lonelyWhitespaces: ws.extract()
Fragestellung:
Kennt jemand einen Weg, wie ich die Kriterien kombinieren kann?
Am schönsten wär es, einen SoupStrainer aus Kombination dieser Drei Bedingungen (nur Unterelemente von <div id="bodyContent">, die nicht Instanz von Comment sind und nicht nur aus Whitspaces bestehen) zu erstellen, damit schon beim Parsen, also beim ersten erstellen des parse-trees das Überflüssige weggelassen wird.
Gruß Niun