Geschicktes Begrenzen des BeautifulSoup Parsers?
Verfasst: Mittwoch 15. November 2006, 22:15
Hallo,
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:
Jetzt habe ich alle Unterelemente des div-Elements im parse-tree. Elemente, die nur aus Whitspaces oder Kommentaren bestehen interessieren mich aber nicht. Also entferne ich diese aus dem parse-tree mit ihren extract Methoden. Dazu muss ich aber zwei Suchen mit verschiedenen Kriterien durchführen, da das "<!--...-->" nicht durch die RegExp gematcht wird:
Was mich daran stört ist, dass ich erstmal Zeug in den Baum übernehme, was ich nicht brauche, und dann den Baum zweimal mit unterschiedlichen Kriterien traversieren muss, um die überflüssigen Elemente zu finden. Ich glaube, dass das viel Zeit und Ressourcen kostet, wenn man das für viele Seiten macht.
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
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