Question

Je travaille sur un algorithme qui essaiera de choisir, à partir d'un fichier HTML, ce qu'il pense être l'élément parent qui contient probablement la majorité du contenu de la page. Par exemple, il choisirait la div " content " dans le code HTML suivant:

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

J'ai proposé quelques idées, telles que parcourir l'arbre de document HTML jusqu'à ses feuilles, additionner la longueur du texte et ne voir que le texte que le parent possède si le parent nous en donne plus que les enfants. faire.

Quelqu'un a-t-il déjà essayé quelque chose de ce genre ou est-il au courant d'un algorithme pouvant être appliqué? Cela n'a pas besoin d'être solide, mais tant qu'il pourra deviner un conteneur contenant la majeure partie du texte du contenu de la page (pour des articles ou des articles de blog, par exemple), ce serait génial.

Était-ce utile?

La solution

Vous pouvez créer une application qui recherche un bloc de texte contigu sans tenir compte des balises de mise en forme (si nécessaire). Vous pouvez le faire en utilisant un analyseur DOM et en parcourant l’arbre en gardant une trace du parent immédiat (car c’est votre sortie).

Commencez par les nœuds parents du formulaire et parcourez l’arbre pour chaque nœud qui se contente de formater, le nombre continuera dans le sous-bloc. Il compterait les caractères du contenu.

Une fois que vous avez trouvé le bloc le plus de contenu, parcourez l'arborescence jusqu'à son parent pour obtenir votre réponse.

Je pense que votre solution repose sur la manière dont vous traversez le DOM et gardez une trace des nœuds que vous analysez.

Quelle langue utilisez-vous? D'autres détails pour votre projet? Vous pouvez également utiliser des outils spécifiques à une langue ou à un package.

Autres conseils

Voici à peu près comment j'aborderais ceci:

// 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;
});

À l'aide de fonctions d'ascendance telles que a.compareDocumentPosition (b) , vous pouvez également recevoir des éléments pendant le tri (ou après), en fonction de la complexité de cette opération.

Vous devrez également formuler un niveau sur lequel vous souhaitez sélectionner le nœud. Dans votre exemple, le nœud "body" contient une quantité de texte encore plus grande. Vous devez donc définir ce qu'est exactement un "élément parent".

Je peux aussi dire que les banques de mots sont d'une grande aide. Toutes les listes de mots "advertisey" communs tels que twitter and click et plusieurs noms en majuscules à la suite. Avoir un étiqueteur POS peut améliorer la précision. Pour les sites d'informations, une liste de toutes les grandes villes connues dans le monde peut vous aider à vous séparer. En fait, vous pouvez presque gratter une page sans même regarder le code HTML.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top