Frage

ich auf einem Algorithmus arbeite, die gegeben auszusuchen werden versuchen, eine HTML-Datei, was er denkt, ist das übergeordnete Element, das höchstwahrscheinlich die Mehrheit der Inhalt der Seite Text enthält. Zum Beispiel würde es den div „Inhalt“ in der folgenden HTML wählen:

<html>
   <body>
      <div id="header">This is the header we don't care about</div>
      <div id="content">This is the <b>Main Page</b> content.  it is the
      longest block of text in this document and should be chosen as
      most likely being the important page content.</div>
   </body>
</html>

Ich habe ein paar Ideen, wie durchquert den HTML-Dokument Baum seine Blätter, Addition der Länge des Textes kommen, und nur sehen, was anderer Text der Eltern haben, wenn die Eltern uns mehr Inhalt als die Kinder geben tun.

Hat jemand schon mal so etwas wie dies versucht, oder wissen von einem Algorithmus, der angewendet werden kann? Es muss nicht fest sein, aber solange es einen Behälter erraten kann, dass die meisten Seiteninhalt Text enthält (für Artikel oder Blog-Posts, zum Beispiel), das wäre genial.

War es hilfreich?

Lösung

Sie können eine App erstellen, die für zusammenhängenden Textblock außer acht gelassen sieht Formatierungs-Tags (falls erforderlich). Sie können dies tun, indem Sie einen DOM-Parser verwenden und den Baum zu Fuß, den Überblick über die nächstgelegenen Eltern halten (weil das Ihre Ausgabe ist).

Starten Form übergeordnete Knoten und durchqueren den Baum für jeden Knoten, der nur die Formatierung, wäre es den ‚count‘ innerhalb dieses Unterblockes weiter. Es würde die Zeichen des Inhalts zählen.

Wenn Sie die meisten Inhaltsblock finden, durchqueren den Baum hinauf zu seinen Eltern zurück Ihre Antwort zu bekommen.

Ich denke, Ihre Lösung stützt sich auf, wie Sie die DOM durchqueren und den Überblick über die Knoten, die Sie scannen möchten.

Welche Sprache verwenden Sie? Alle anderen Details für Ihr Projekt? Es können spezielle Werkzeuge sein sprachspezifische oder verpacken Sie auch nutzen könnten.

Andere Tipps

Ein Wort: Boilerpipe

Hier ist etwa, wie ich dies würde Ansatz:

// get array of all elements (body is used as parent here but you could use whatever)
var elms = document.body.getElementsByTagName('*');
var nodes = Array.prototype.slice.call( elms, 0 );

// get inline elements out of the way (incomplete list)
nodes = nodes.filter(function (elm) {
  return !/^(a|br?|hr|code|i(ns|mg)?|u|del|em|s(trong|pan))$/i.test( elm.nodeName );
});

// sort elements by most text first
nodes.sort(function(a,b){
  if (a.textContent.length == b.textContent.length) return 0;
  if (a.textContent.length > b.textContent.length)  return -1;
  return 1;
});

Mit Abstammung Funktionen wie a.compareDocumentPosition(b), können Sie auch Elemente sinken während des Sortierens (oder nach), je nachdem, wie komplex diese Sache sein muss.

Sie müssen auch eine Ebene formulieren, auf dem Sie den Knoten auswählen möchten. In Ihrem Beispiel hat der ‚Körper‘ Knoten eine noch größere Menge an Text in ihm. Also muss man formulieren, was ein ‚übergeordnetes Element‘ genau ist.

kann ich auch sagen, dass Wort Banken eine große Hilfe sind. Listen mit gemeinsamen ‚advertisey‘ Wörter wie twitter und klicken und mehrere aktivierte Substantive in Folge. ein POS-Tagger zu haben, kann die Genauigkeit verbessern. Für Nachrichten-Sites kann eine Liste aller bekannten großen Städte in der Welt getrennt helfen. In der Tat kann man fast eine Seite kratzen, ohne auch nur im HTML zu suchen.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top