Zusammenhängende Texte aus Webseiten extrahieren

WhiZZler

Chancentod²
ID: 85586
L
6 Mai 2006
588
32
Begrüße!

Für eine Untersuchung möchte ich aus Webseiten zusammenhängende, im Browser sichtbare Texte extrahieren. Die Ergebnisse müssen dabei nicht 100% korrekt sein. Eine oberflächliche Analyse des Quelltextes reicht also völlig. Ob der Text tatsächlich angezeigt wird, oder ob er über ein "display:none;" an irgendeiner Stelle versteckt wird, oder ob er die gleiche Farbe hat wie der Hintergrund soll also vernachlässigt werden.

Mein erster Gedanke war es, das Ganze über reguläre Ausdrücke zu lösen. Das Problem dabei ist die Verschachtelung der HTML Elemente und dass nicht in jedem HTML Element im innerHTML Teil sichtbarer Text enthalten ist, der tatsächlich als Text im Browser ausgegeben wird.
Ein einfaches Beispiel:
PHP:
<div id="foo">
  <div id="bar">
    <p>Hier steht Text</p>
  </div>
</div>

Mein Gedanke war es daher, einen regulären Ausdruck zu formulieren, der nur dann ein Match liefert, wenn im innerHTML eines Elements kein "<" und kein ">" vorhanden ist, sprich keine weiteren HTML Elemente. Dafür habe ich folgenden regulären Ausdruck geschrieben:
Code:
<[^>]*>([^<>]+)</[^>]*>

Das funktioniert soweit auch ganz gut. Allerdings habe ich dabei nicht beachtet, dass der Ausdruck nicht funktioniert, wenn in dem Paragraph beispielsweise ein Link steht. Also zum Beispiel:
PHP:
<div id="foo">
  <div id="bar">
    <p>Hier steht Text. Mit <a href="example.html">Link</a></p>
  </div>
</div>
Dadurch ist der Ansatz in dieser Form eigentlich unbrauchbar und müsste erweitert werden. Ich frage mich also, wie ich Links im Text oder auch Paragraphen (<p>) und ähnliche Elemente, welche mir noch nicht eingefallen sind, behandeln soll. Möglich wäre es, den HTML Code dieser Elemente zu entfernen, damit nur noch der reine Text über bleibt. Aber welche Elemente sollte man dabei entfernen?

Oder denkt ihr, dass man über klassisches Parsen des DOM Baumes zu besseren Ergebnissen kommt? Auch hier wären wohl wieder bestimmte Regeln für gewisse, noch zu definierende Elemente, nötig.

Hat vielleicht jemand weitere Ideen, wie man sowas umsetzen könnte? Ich weiß, dass meine Fragestellung recht vage ist. Ich konnte für mich selbst auch noch nicht 100% definieren, was denn zusammenhängender Text auf einer Webseite eigentlich ist. Ich erhoffe mir mit diesem Thread also Ideen und/oder einen Schubs in die richtige Richtung.

Falls jemand was zu Arbeiten zu diesem Thema kennt, dann wäre ich über Links oder Namen äußerst dankbar. Mangels passender Suchbegriffe war eine Suche bis jetzt erfolglos.

Danke im Vorraus,
MfG,
WhiZZler
 
Ist sicher nicht ganz leicht. Du musst ja schließlich auch mit der "Dummheit" rechnen, dass kein valides HTML benutzt wird..

Ansonsten: Automatisiert Screenshots machen und OCR drüber laufen lassen :D
 
:arrow: Readability
:arrow: Boilerpipe

Readability ist ein sehr bekanntes Projekt, da könntest du Glück haben einen mehr oder weniger aktuellen Port auf jede Programmiersprache zu finden.
Selbst schreiben würde ich ganz lassen, das wird vorne und hinten schief gehen.
 
Ist sicher nicht ganz leicht. Du musst ja schließlich auch mit der "Dummheit" rechnen, dass kein valides HTML benutzt wird..

Ansonsten: Automatisiert Screenshots machen und OCR drüber laufen lassen :D

Die Dummheit würde ich einfach nicht beachten, zumal ich so oder so keine absolute Genauigkeit garantieren kann ;)

:arrow: Readability
:arrow: Boilerpipe

Readability ist ein sehr bekanntes Projekt, da könntest du Glück haben einen mehr oder weniger aktuellen Port auf jede Programmiersprache zu finden.
Selbst schreiben würde ich ganz lassen, das wird vorne und hinten schief gehen.

Ice, du bist ein Gott! Für meine Zwecke sieht vor allem Boilerpipe extrem vielversprechend aus, da das Ganze in einem Java Programm eingebunden werden soll. Und noch dazu gibt es zu Boilerpipe ein Paper, mit dem ich auf jeden Fall weiterkommen werde. Grandios ;) Um einiges besseres als ein eigener Ansatz, der dann wohl eh nicht so richtig funktionieren würde.