web-dev-qa-db-ja.com

HTMLページからメインのテキストコンテンツのみを抽出するにはどうすればよいですか?

更新

Boilerpipeは非常にうまく機能しているように見えますが、多くのページに記事がないため、メインコンテンツだけが必要ではなく、テキスト全体への短い説明のリンクのみが必要であることに気付きました(これはニュースポータルで一般的です)。これらのショートテキストを破棄したくありません。

したがって、APIがこれを行う場合は、単一のテキストとは異なる方法でそれぞれを分割するさまざまなテキスト部分/ブロックを取得してください(すべて1つのテキストだけでは役に立ちません)。報告してください。


質問

ランダムなサイトからいくつかのページをダウンロードしましたが、ページのテキストコンテンツを分析したいと思います。

問題は、Webページにメニュー、宣伝、バナーなどのコンテンツがたくさんあることです。

ページの内容に関係のないものはすべて除外したいと思います。

このページを例にとると、フッターのリンクの上にあるメニューは必要ありません。

重要:すべてのページはHTMLであり、さまざまなサイトのページです。これらのコンテンツを除外する方法の提案が必要です。

現時点では、「menu」クラスと「banner」クラス内のコンテンツをHTMLから除外し、固有名詞(最初の大文字)のように見える連続した単語を除外すると思います。

ソリューションは、テキストコンテンツ(HTMLタグなし)またはHTMLコンテンツ(HTMLタグ付き)に基づくことができます。

編集:これを外部アプリケーションではなくJavaコード内で実行したい(可能な場合) 。

この質問で説明されているHTMLコンテンツを解析する方法を試しました: https://stackoverflow.com/questions/7035150/how-to-traverse-the-dom-tree-using-jsoup-doing-some-content -フィルタリング

20
Renato Dinhani

Boilerpipe を見てください。それはあなたが探していることを正確に行うように設計されており、ウェブページのメインテキストコンテンツの周りの余分な「クラッター」(ボイラープレート、テンプレート)を取り除きます。

HTMLをBoilerpipeにフィードしてHTMLを抽出する方法はいくつかあります。

次のことができます RLを使用

ArticleExtractor.INSTANCE.getText(url);

次のことができます 文字列を使用

ArticleExtractor.INSTANCE.getText(myHtml);

リーダーを使用 のオプションもあり、多数のオプションが開きます。

22
Kurt Kaylor

boilerpipe tosegmentを使用して、テキストをフルテキスト/非フルテキストのブロックにすることもできます。それらの1つを返します(基本的に、最初にボイラーパイプセグメントを返し、次に文字列を返します)。

Java.io.ReaderからHTMLにアクセスできると仮定して、ボイラーパイプでHTMLをセグメント化し、セグメントを分類します。

Reader reader = ...
InputSource is = new InputSource(reader);

// parse the document into boilerpipe's internal data structure
TextDocument doc = new BoilerpipeSAXInput(is).getTextDocument();

// perform the extraction/classification process on "doc"
ArticleExtractor.INSTANCE.process(doc);

// iterate over all blocks (= segments as "ArticleExtractor" sees them) 
for (TextBlock block : getTextBlocks()) {
    // block.isContent() tells you if it's likely to be content or not 
    // block.getText() gives you the block's text
}

TextBlockにはもっとエキサイティングな方法がいくつかありますので、お気軽に遊んでください!

Boilerpipeに問題がある可能性があります。どうして?そうですね、単一のコンテンツを含むWebページなど、特定の種類のWebページに適しているようです。

したがって、Boilerpipeに関してWebページを大まかに3種類に分類できます。

  1. 単一の記事が含まれているWebページ(Boilerpipeに値する!)
  2. ニューヨークタイムズのフロントページなど、複数の記事が含まれるWeb
  3. 実際には記事が含まれていないが、リンクに関するコンテンツが含まれているが、ある程度の混乱があるWebページ。

Boilerpipeはケース#1で動作します。しかし、多くの自動テキスト処理を行っている場合、ソフトウェアはどのような種類のWebページを扱っているかをどのように「認識」しているのでしょうか。 Webページ自体をこれら3つのバケットのいずれかに分類できる場合は、ケース#1にBoilerpipeを適用できます。ケース#2は問題であり、ケース#3も問題です。何が雑然としていて何がそうでないかを判断するために、関連するWebページの集約が必要になる場合があります。

5
Stefan

私の最初の本能は、Jsoupを使用する最初の方法を採用することでした。少なくともそれで、セレクターを使用して、必要な要素のみを取得できます(つまり、Elements posts = doc.select("p");であり、ランダムなコンテンツを持つ他の要素について心配する必要はありません。

あなたの他の投稿の問題で、誤検知の問題は、Jsoupから離れる唯一の理由でしたか?もしそうなら、MIN_WORDS_SEQUENCEの数を微調整したり、セレクターでより選択的にしたりすることはできません(つまり、div要素を取得しないでください)

1
Aaron Foltz

http://kapowsoftware.com/products/kapow-katalyst-platform/robo-server.php

プロプライエタリソフトウェアですが、Webページからの抽出が非常に簡単で、Javaとうまく統合できます。

提供されているアプリケーションを使用して、roboserverapiによって読み取られるxmlファイルを設計してWebページを解析します。 xmlファイルは、提供されたアプリケーション内で解析するページを分析し(かなり簡単)、データを収集するためのルールを適用することによって作成されます(通常、Webサイトは同じパターンに従います)。提供されているJava APIを使用して、スケジューリング、実行、およびデータベース統合をセットアップできます。

ソフトウェアを使用して自分でそれを行うことに反対している場合は、すべてのサイトに1つのルールを適用しようとしないことをお勧めします。タグを分離してからサイトごとに構築する方法を見つける

1
getn_outchea

goose のようないくつかのライブラリを使用できます。それは記事/ニュースで最もよく働きます。 読みやすさのブックマークレット を使用して、ガチョウと同様の抽出を行うJavaScriptコードを確認することもできます。

1
Felipe Hummel

HTMLジャンクをフィルタリングしてから、必要な詳細を解析するか、既存のサイトのAPIを使用できます。以下のリンクを参照してHTMLをフィルタリングしてください。お役に立てば幸いです。 http://thewiredguy.com/wordpress/index.php/2011/07/dont-have-an-apirip-dat-off-the-page/

0
Tushar Sagar

textracto apiを使用できます。これにより、メインの「記事」テキストが抽出され、その他すべてを抽出する機会もありますテキストコンテンツ。これらのテキストを「差し引く」ことにより、ナビゲーションテキスト、プレビューテキストなどをメインのテキストコンテンツから分割できます。

0
David L-R

「HTMLスクレイパー」または「スクリーンスクレイパー」として知られているものを探しています。ここにあなたのためのいくつかのオプションへのいくつかのリンクがあります:

タグスープ

HTMLユニット

0
Jared Ng