削り最大級のブロックのテキストからHTMLドキュメント
-
08-07-2019 - |
質問
また、アルゴリズムとして取り出されたHTMLファイルとその考えは、親要素が多く含むの多くはページのコンテンツです。例えば、この部"の内容を下記の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>
私は、アイデアなどを横断するHTMLドキュメントツリー、紅葉、追加までの長さの文字だけを見てその他のテキストの親会社が場合は、親会社を合わせたコンテンツの子どもいます。
はものって思ったこと、または知らのアルゴリズムに応用できる?いものだけができるもので推測するコンテナが含まれていますのページの内容テキスト(ブなど)は、どちらかというと。
解決
フォーマットタグを無視して、テキストの連続ブロックを探すアプリを作成できます(必要な場合)。これを行うには、DOMパーサーを使用してツリーをたどり、直接の親を追跡します(これが出力であるため)。
親ノードからフォームを開始し、フォーマット中の各ノードのツリーを走査します。そのサブブロック内で「カウント」を継続します。コンテンツの文字をカウントします。
最も多くのコンテンツブロックが見つかったら、ツリーを遡って親に戻り、答えを取得します。
ソリューションは、DOMをどのように走査し、スキャンしているノードを追跡する方法に依存していると思います。
どの言語を使用していますか?プロジェクトの他の詳細はありますか?言語固有のツールやパッケージ固有のツールも使用できます。
他のヒント
一言で言うならば" Boilerpipe
これにどのようにアプローチするかを大まかに示します。
// 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)
などの祖先関数を使用すると、この処理の複雑さに応じて、ソート中(またはソート後)に要素をシンクすることもできます。
ノードを選択するレベルを定式化する必要もあります。この例では、「body」ノードにはさらに多くのテキストが含まれています。したがって、「親要素」とは何かを正確に定式化する必要があります。
また、ワードバンクは大きな助けになると言えます。ツイッターやクリックなどの一般的な「広告」の単語のリストと、大文字の名詞が連続しています。 POSタガーを使用すると、精度が向上します。ニュースサイトの場合、世界のすべての既知の主要都市のリストが分離に役立ちます。実際、HTMLを見なくてもほとんどページを削ることができます。