Domanda

Sto lavorando a un algoritmo che proverà a individuare, dato un file HTML, quello che pensa sia l'elemento genitore che molto probabilmente contiene la maggior parte del testo del contenuto della pagina. Ad esempio, sceglierebbe il div " content " nel seguente 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>

Ho avuto alcune idee, come attraversare l'albero del documento HTML fino alle sue foglie, sommare la lunghezza del testo e vedere solo quale altro testo il genitore ha se il genitore ci dà più contenuto dei figli fare.

Qualcuno ha mai provato qualcosa di simile o conosce un algoritmo che può essere applicato? Non deve essere solido, ma fintanto che può indovinare un contenitore che contiene la maggior parte del testo del contenuto della pagina (per articoli o post di blog, ad esempio), sarebbe fantastico.

È stato utile?

Soluzione

È possibile creare un'app che cerchi blocchi contigui di testo ignorando i tag di formattazione (se necessario). Puoi farlo usando un parser DOM e camminando sull'albero, tenendo traccia del genitore immediato (perché quello è il tuo output).

Inizia dai nodi principali e attraversa l'albero per ogni nodo che sta solo formattando, continuerebbe il 'conteggio' all'interno di quel blocco secondario. Conterrebbe i caratteri del contenuto.

Una volta trovato il maggior numero di blocchi di contenuti, attraversa il backup dell'albero fino al genitore per ottenere la tua risposta.

Penso che la tua soluzione si basi sul modo in cui attraversi il DOM e tieni traccia dei nodi che stai analizzando.

Che lingua stai usando? Altri dettagli per il tuo progetto? Potrebbero esserci anche strumenti specifici per lingua o pacchetti specifici che potresti usare.

Altri suggerimenti

Una sola parola: Boilerpipe

Ecco come mi avvicinerei a questo:

// 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 le funzioni di origine come a.compareDocumentPosition (b) , puoi anche affondare elementi durante l'ordinamento (o dopo), a seconda di quanto complessa debba essere questa cosa.

Dovrai anche formulare un livello su cui vuoi selezionare il nodo. Nel tuo esempio, il nodo 'body' contiene una quantità ancora maggiore di testo. Quindi devi formulare cos'è esattamente un "elemento genitore".

Posso anche dire che le banche di parole sono di grande aiuto. Qualsiasi elenco di parole comuni come "pubblicizza" come twitter e clic e diversi nomi in maiuscolo di fila. Avere un tagger POS può migliorare la precisione. Per i siti di notizie, un elenco di tutte le principali città conosciute nel mondo può aiutare a separarsi. In effetti, puoi quasi raschiare una pagina senza nemmeno guardare l'HTML.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top