Pregunta

Estoy trabajando en un algoritmo que intentará seleccionar, dado un archivo HTML, lo que cree que es el elemento principal que probablemente contiene la mayoría del texto del contenido de la página. Por ejemplo, elegiría el contenido de div " en el siguiente HTML:

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

Se me ocurrieron algunas ideas, como atravesar el árbol del documento HTML a sus hojas, sumar la longitud del texto y solo ver qué otro texto tiene el padre si el padre nos da más contenido que los hijos. hacer.

¿Alguien ha intentado algo como esto o conoce un algoritmo que se pueda aplicar? No tiene que ser sólido, pero siempre que pueda adivinar un contenedor que contenga la mayor parte del texto del contenido de la página (para artículos o publicaciones de blog, por ejemplo), sería increíble.

¿Fue útil?

Solución

Puede crear una aplicación que busque bloques contiguos de texto sin tener en cuenta las etiquetas de formato (si es necesario). Puede hacerlo mediante el uso de un analizador DOM y caminando por el árbol, haciendo un seguimiento del elemento primario inmediato (porque esa es su salida).

Inicie los nodos principales del formulario y atraviese el árbol para cada nodo que solo esté formateando, continuaría el 'conteo' dentro de ese subbloque. Contaría los caracteres del contenido.

Una vez que encuentre el mayor bloque de contenido, retroceda el árbol hasta su padre para obtener su respuesta.

Creo que su solución se basa en cómo atraviesa el DOM y realiza un seguimiento de los nodos que está escaneando.

¿Qué idioma estás usando? ¿Algún otro detalle para tu proyecto? Puede haber herramientas específicas del idioma o del paquete que también podría usar.

Otros consejos

Una palabra: Boilerpipe

Aquí es más o menos cómo abordaría esto:

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

Usando funciones de ascendencia como a.compareDocumentPosition (b) , también puede hundir elementos durante la clasificación (o después), dependiendo de lo complejo que deba ser esto.

También tendrá que formular un nivel en el que desea seleccionar el nodo. En su ejemplo, el nodo 'cuerpo' tiene una cantidad de texto aún mayor. Por lo tanto, debe formular qué es exactamente un "elemento principal".

También puedo decir que los bancos de palabras son de gran ayuda. Cualquier lista de palabras comunes de 'publicidad' como twitter y click y varios sustantivos en mayúscula seguidos. Tener un etiquetador POS puede mejorar la precisión. Para los sitios de noticias, una lista de todas las principales ciudades conocidas del mundo puede ayudar a separarse. De hecho, casi puedes raspar una página sin siquiera mirar el HTML.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top