Pergunta

Eu estou trabalhando em um algoritmo que vai tentar escolher para fora, dado um arquivo HTML, o que ele pensa que é o elemento pai que provavelmente contém a maior parte do texto o conteúdo da página. Por exemplo, seria escolher o "conteúdo" div na seguinte 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>

Eu vim acima com algumas idéias, como percorrer a árvore documento HTML para suas folhas, acrescentando-se o comprimento do texto, e só ver o que outro texto o pai tem se o pai dá-nos mais conteúdo do que as crianças fazer.

Alguém já tentou algo parecido com isso, ou sabe de um algoritmo que pode ser aplicado? Ele não tem que ser sólido, mas contanto que ele pode adivinhar um recipiente que contém a maior parte do texto conteúdo da página (para artigos ou posts, por exemplo), que seria fantástico.

Foi útil?

Solução

Você pode criar um aplicativo que procura bloco contíguo de desconsideração formatação de texto etiquetas (se necessário). Você pode fazer isso usando um analisador DOM e caminhando a árvore, mantendo o controle do pai imediato (porque essa é a sua saída).

Iniciar formulário nós pai e percorrer a árvore para cada nó que está apenas a formatação, que vai continuar a 'contar' dentro desse sub bloco. Ele contaria os caracteres do conteúdo.

Depois de encontrar o bloco mais conteúdo, travessia backup da árvore para seu pai para obter a sua resposta.

Eu acho que sua solução depende de como você percorrer o DOM e acompanhar os nós que você está digitalizando.

Que linguagem você está usando? Quaisquer outros detalhes para o seu projeto? Pode haver específica linguagem ou ferramentas específicas do pacote que você poderia usar também.

Outras dicas

Uma palavra: Boilerpipe

Aqui está mais ou menos como eu iria abordar esta:

// 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 ascendência funções como a.compareDocumentPosition(b), você também pode afundar elementos durante a classificação (ou depois), dependendo de como as necessidades dessa coisa complexa para ser.

Você também terá de formular um nível em que você quer selecionar o nó. No seu exemplo, o nó do 'corpo' tem uma quantidade ainda maior de texto nele. Então você tem que formular o que é um 'elemento pai' é exatamente.

Posso também dizer que os bancos palavra são uma grande ajuda. Quaisquer listas de palavras comuns 'advertisey' como Twitter e clique e vários nomes capitalizados em uma fileira. Ter um tagger POS pode melhorar a precisão. Para sites de notícias, uma lista de todas as grandes cidades conhecidas no mundo pode ajudar separado. Na verdade, você quase pode raspar uma página sem sequer olhar para o HTML.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top