3

背景
メニュー、サイドバー、スクリプト、およびその他の HTML クラッターなしで、ページのメイン コンテンツに焦点を当てて、Web ページのコンテンツを読み取って分析しようとしています。

私は何を試しましたか?

  • NReadabilityを試しましたが、例外がスローされ、多くの場合に失敗します。それ以外は良い解決策です。
  • HTML Agility Pack は、ここで必要なものではありません。コンテンツ以外のコードも削除したいからです。

編集:実際にコンテンツをふるいにかけ、ページから「関連する」テキストのみを提供するライブラリを探しています(つまり、このページでは、「レビュー」、「チャット」、「メタ」、「約」という単語) 、トップバーの「よくある質問」、および「以下でライセンスされているユーザーの貢献」は表示されません。

Web サイトからコンテンツを抽出するための安定した .Net ライブラリを他に知っていますか?

4

2 に答える 2

7

これがまだ関連しているかどうかはわかりませんが、これは私がよく遭遇する興味深い質問であり、ウェブ上でそれをカバーする資料をあまり見たことがありません.

私は自分で数か月にわたってこれを行うツールを実装しました。契約上の義務から、このツールを自由に共有することはできません。ただし、あなたができることについてのアドバイスを自由に共有できます。

悲しい真実 :(

可読性ツールを自分で作成する作業に着手する前に、すべてのオプションを試したことを保証できます。現時点では、私たちが必要としているものに満足できるツールは存在しません。

では、コンテンツを抽出しますか?

すごい!いくつかのものが必要になります

  1. ページの HTML を処理するためのツール。上記の回答でJamieが提案したCsQueryを使用しています。要素を選択するのに最適です。
  2. プログラミング言語 (この例では C# です。どの .NET 言語でもかまいません!)
  3. ページ自体をダウンロードできるツール。CsQueryそれ自体でcreateFromUrl。ページを前処理し、ヘッダーをより細かく制御したい場合は、ページをダウンロードするための独自のヘルパー クラスを作成できます。(ユーザー エージェントで遊んでみたり、モバイル バージョンを探したりするなど)

よし、準備は整った。次は何をする?

コンテンツ抽出の分野での研究は驚くほど少ない。際立っているのは、浅いテキスト機能を使用したボイラープレート検出です。論文の著者による StackOverflow のこちらの回答を読んで、読みやすさの仕組みといくつかのアプローチを確認することもできます。

ここに私が楽しんだいくつかの論文があります:

私は読み終わった、実際に行われたこと

私の経験から、コンテンツを抽出するための優れた戦略は次のとおりです。

  • シンプルなヒューリスティック: フィルタリング<header><nav>タグ付け、リンクのみのリストの削除。セクション全体を削除します<head>。名前に基づいて要素に負/正のスコアを付け、スコアが最も低い要素を削除します (たとえば、名前を含むクラスを持つ div は、navigationより低いスコアを取得する可能性があります)。これが読みやすさの仕組みです。

  • メタコンテンツ。テキストへのリンクの密度を分析します。これはそれ自体が強力なツールです。リンク テキストの量を html テキストと比較して、それを操作できます。通常、最も密度の高いテキストはコンテンツのある場所です。CsQueryテキストの量と、ネストされたリンク タグ内のテキストの量を簡単に比較できます。

  • テンプレート。同じ Web サイトの複数のページをクロールし、それらの違いを分析します。定数は通常、ページ レイアウト、ナビゲーション、および広告です。通常、類似性に基づいてフィルタリングできます。この「テンプレート」ベースのアプローチは非常に効果的です。秘訣は、テンプレートを追跡し、テンプレート自体を検出するための効率的なアルゴリズムを考え出すことです。

  • 自然言語処理。これはおそらく最も高度なアプローチであり、自然言語処理ツールを使用して、段落、テキスト構造、および実際のコンテンツの開始位置と終了位置を検出するのは比較的簡単です。

  • 学習、学習は、この種のタスクにとって非常に強力な概念です。最も基本的な形式では、これには、Web サイトから事前に定義された一連の結果に基づいて削除する HTML 要素を「推測」し、どのパターンを削除してもよいかを学習するプログラムの作成が含まれます。私の経験では、このアプローチはサイトごとのマシンで最も効果的です。

  • セレクターの固定リスト。驚くべきことに、これは非常に強力であり、人々はそれを忘れがちです. セレクターを使用して特定のいくつかのサイトからスクレイピングしている場合、コンテンツを手動で抽出するのがおそらく最速の方法です。できればシンプルにしてください:)

実際には

うまく組み合わせることができます。通常、優れたソリューションには、いくつかの戦略を組み合わせた複数の戦略が含まれます。複雑なタスクに使用するため、非常に複雑なものになりました。実際には、コンテンツの抽出は非常に複雑な作業です。非常に一般的なものを作成しようとしないでください。スクレイピングする必要があるコンテンツに固執してください。多くのテストを行います。単体テストと回帰は、この種のプログラムにとって非常に重要です。常に読みやすいコードを比較して読んでください。それは非常に単純であり、おそらく始めることができます。

頑張ってください、これがどうなるか教えてください。

于 2013-03-26T22:49:10.790 に答える
1

CsQuery: https://github.com/jamietre/csquery

これは .NET 4 jQuery ポートです。非コンテンツ ノードを取り除くには、いくつかの方法があり.Textます。すべてを文字列として取得する方法。またはテキストノードをフィルタリングします。

var dom = CQ.CreateFromUrl(someUrl); 
// or var dom = CQ.Create(htmlText);

IEnumerable<string> allTextStrings = dom.Select("*")
            .Contents()
            .Where(el => el.NodeType == NodeType.TEXT_NODE)
            .Select(el => el.NodeValue);

jQuery と同じように機能しますが、もちろん、.NET フレームワークと LINQ を使用して作業を簡単にすることもできます。Selectは、DOM 内のすべてのノードを選択してから、Contentsそれぞれのすべての子 (テキスト ノードを含む) を選択します。CsQuery については以上です。次に、LINQ を使用してWhereテキスト ノードのみをフィルターSelectし、各ノードから実際のテキストを取得します。

これには多くの空白が含まれ、すべてが返されます。ページ全体のテキストの塊が必要な場合は、

string text = dom.Select("body").Text();

やります。このTextメソッドは空白を結合するため、実際のテキストの各部分の間に単一のスペースが存在します。

于 2012-06-07T18:11:22.293 に答える