4

私は、HTML ファイルが与えられたときに、ページのコンテンツ テキストの大部分を含む可能性が最も高い親要素であると考えられるものを選択しようとするアルゴリズムに取り組んでいます。たとえば、次の HTML では div "content" が選択されます。

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

HTML ドキュメント ツリーを葉までたどり、テキストの長さを合計し、親が子よりも多くのコンテンツを提供する場合にのみ、親が持っている他のテキストを確認するなど、いくつかのアイデアを思いつきました。

誰かがこのようなことを試したことがありますか、または適用できるアルゴリズムを知っていますか? 堅実である必要はありませんが、ページ コンテンツ テキスト (記事やブログ投稿など) のほとんどを含むコンテナーを推測できる限り、それは素晴らしいことです。

4

5 に答える 5

10

一言:ボイラーパイプ

于 2010-12-29T22:39:51.740 に答える
5

私がこれにアプローチする方法はおおまかに次のとおりです。

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

のような祖先関数を使用するとa.compareDocumentPosition(b)、必要な複雑さに応じて、並べ替え中 (または並べ替え後) に要素をシンクすることもできます。

于 2008-11-14T14:00:55.057 に答える
1

また、ノードを選択するレベルを作成する必要があります。あなたの例では、「body」ノードにはさらに大量のテキストが含まれています。したがって、「親要素」が正確に何であるかを定式化する必要があります。

于 2008-11-14T08:18:28.710 に答える
0

ワードバンクは大きな助けになるとも言えます。ツイッターやクリックなどの一般的な「宣伝」単語のリストと、いくつかの大文字の名詞が連続しています。POSタガーを使用すると、精度を向上させることができます。ニュースサイトの場合、世界のすべての既知の主要都市のリストが分離に役立ちます。実際、HTMLを見なくても、ほとんどページを削ることができます。

于 2011-05-03T11:41:59.440 に答える
0

書式設定タグを無視して、連続するテキストブロックを検索するアプリを作成できます(必要な場合)。これを行うには、DOMパーサーを使用してツリーをウォークし、直接の親を追跡します(これが出力であるため)。

親ノードから開始し、フォーマットしている各ノードのツリーをトラバースすると、そのサブブロック内で「カウント」が続行されます。コンテンツの文字数をカウントします。

最も多くのコンテンツブロックを見つけたら、ツリーをトラバースしてその親に戻り、答えを取得します。

あなたの解決策は、DOMをトラバースし、スキャンしているノードを追跡する方法に依存していると思います。

どの言語を使用していますか?プロジェクトに関するその他の詳細はありますか?言語固有またはパッケージ固有のツールも使用できる場合があります。

于 2008-11-14T08:13:04.073 に答える