情報アイランド

「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。

Node.jsでunfluffを使ってHTMLドキュメントの内容を抽出する

HTMLドキュメントの内容を抽出するには下のようなモジュールを利用する方法があります。

  • unfluff
  • extract-main-text

この記事ではunfluffモジュールを利用する方法を取り上げます。


unfluff関数を呼び出します。

var unfluff = require('unfluff');

var content = unfluff('xxx', 'yyy');

第1引数にHTMLドキュメントを指定します。

第2引数にHTMLドキュメントの言語コードを指定します。この引数は指定しなくても構いません。

返り値としてHTMLドキュメントの内容がオブジェクトとして得られます。

このオブジェクトには主に下のようなプロパティが含まれています。

  • title・・・タイトルです(titleタグの内容です)。
  • softTitle・・・長いタイトルです。
  • date・・・投稿日時です。
  • copyright・・・著作権表示です。
  • author・・・執筆者です。
  • publisher・・・サイト名です。
  • text・・・本文です。
  • image・・・メイン画像です。
  • videos・・・全ての動画です。
  • tags・・・全てのタグです。
  • canonicalLink・・・カノニカルURLです。
  • lang・・・言語です。
  • description・・・メタディスクリプションです。
  • favicon・・・ファビコンのURLです。

サンプルコード1

3つ目のコマンドライン引数として与えられたURLからテキストデータを取得し、HTMLドキュメントとして内容を抽出し、標準出力に出力します。

なお、Webサイトからテキストデータを取得する方法に関しては下の記事を参照してください。

URLに応じてhttpモジュールとhttpsモジュールの何れか適切なものを使用します。

データの文字コードがiconv-liteモジュールがサポートしていないものである場合にはエラーとします。

なお、ストリームの処理のためにconcatStream関数とpump関数を使用しています。

unfluff.js

var url = require('url');
var http = require('http');
var https = require('https');
var concatStream = require('concat-stream');
var mimelib = require('mimelib');
var jschardet = require('jschardet');
var iconvLite = require('iconv-lite');
var unfluff = require('unfluff');
var pump = require('pump');

if (process.argv.length < 3) {
    console.error('lack argument.');
    process.exit(1);
}

var client = (url.parse(process.argv[2], false).protocol === 'https:' ? https : http).get(process.argv[2], function (res) {
    if (res.statusCode === 200) {
        var writable = concatStream(function (data) {
            var encoding = undefined;
            if (res.headers['content-type'] !== undefined) {
                encoding = mimelib.parseHeaderLine(res.headers['content-type']).charset;
            }
            if (encoding === undefined) {
                encoding = jschardet.detect(data).encoding;
            }
            if (encoding !== undefined && iconvLite.encodingExists(encoding)) {
                console.log(unfluff(iconvLite.decode(data, encoding)));
            }
            else {
                console.error('can\'t detect encoding.');
                process.exit(1);
            }
        });
        pump(res, writable, function (err) {
            if (err) {
                console.error(err);
                process.exit(1);
            }
        });
    }
    else {
        console.error('can\'t process.');
        process.exit(1);
    }
});
client.setTimeout(10000, function () {
    console.error('timeouted.');
    client.abort();
});
client.on('error', function (err) {
    console.error(err);
    process.exit(1);
});

使用パッケージ

  • concat-stream
    npm install concat-streamでインストールします。
  • mimelib
    npm install mimelibでインストールします。
  • JsChardet
    npm install jschardetでインストールします。
  • Pure JS character encoding conversion
    npm install iconv-liteでインストールします。
  • unfluff
    npm install unfluffでインストールします。
  • pump
    npm install pumpでインストールします。

実行結果

このブログの記事の内容を抽出してみましたが、残念ながら正しく抽出することはできませんでした。

C:\work\node>node unfluff.js http://info-i.net/querystring-parse
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
WARNING: No stopwords file found for 'ja' - defaulting to English!
{ title: 'Node.jsでクエリ文字列をパースする',
  softTitle: 'Node.jsでクエリ文字列をパースする',
  date: '2016-05-21T21:09:41Z',
  author: [ '' ],
  publisher: '情報アイランド',
  copyright: '. Node.js. 情報アイランド. 「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。. Node.js. HOME. >. Node.js >. Node.jsでクエリ文字列をパースする. 2016/05/21. 2016/11/26. 目次1 querystringモジュール2 qsモジュール3 サンプルコード13.1 querystring-parse.js3.2 実行結果4 サンプルコード24.1 qs-parse.js4.2 使用パッケージ4.3 実行結果5 関連. クエリ文字列とはURI(URL)のクエリ部分のことです。. URI(URL)のクエリ部分とは?. ウェブ開発者なら必ず知っておくべき基礎知識(2) URI(URL)の構文. URI(URL)には下のような構成要素を特定の区切り文字を使用して順番に記述します。 スキーム ホスト ポート パス クエリ フラグメント 上の構成要素を全て含むURIの例としては下のようなものがあります。 http://www.abc.org:1234/foo/bar.txt?param1=a&". クエリ文字列をパースするには下のようなモジュールを利用する方法があります。. querystring. qs. querystringモジュール. querystring.parse関数を使用します。. var querystring = require(\'querystring\');. var q = querystring.parse(\'xxx\');. 第1引数にクエリ文字列を指定します。. 返り値としてクエリ文字列を表すオブジェクトが得られます。. このオブジェクトではクエリ文字列のキーがプロパティ名となり、値がプロパティの値となります。クエリ文字列に同一のキーが複数存在する場合にはプロパティの値はそれらの値を全て含む配列となります。. qsモジュール. qs.parse関数を使用します。. var qs = require(\'qs\');. var q = qs.parse(\'xxx\', {. depth: 5,. parameterLimit: 1000,. delimiter: \'&\',. allowDots: false,. arrayLimit: 20,. parseArrays: true. });. 第1引数にクエリ文字列を指定します。. 第2引数にオプションをオブジェクトとして指定します。この引数は指定しなくても構いません。. 返り値としてクエリ文字列を表すオブジェクトが得られます。. この関数はquerystring.parse関数と同様ですが、クエリ文字列のサブキーをパースすることができます。. サブキーとはキーに付加された別の1つ以上のキーであり、[と]で囲みます。. たとえば、サブキーを含むクエリ文字列は?foo[bar][baz]=quxのようなものとなります。この場合、サブキーはbarとbazです。. この関数がサブキーをパースした結果は入れ子のオブジェクトとなります。. たとえば、?foo[bar][baz]=quxのパース結果は{ foo: { bar: { baz: \'qux\' } }となります。. ただし、全てのサブキーが20以下の数値か空の文字列である場合にはサブキーをパースした結果は配列となります。. たとえば、?foo[0]=bar&foo[1]=baz&foo[2]=quxのパース結果は{ foo: [\'bar\', \'baz\', \'qux\'] }となります。. 第2引数のオプションには主に下のようなものがあります。. depth・・・サブキーの最大数を指定します。デフォルトは5です。. parameterLimit・・・パラメータの最大数を指定します。デフォルトは1000です。. delimiter・・・パラメータの区切り文字を文字列か正規表現として指定します。デフォルトは&です。. allowDots・・・サブキーを[と]で囲むのではなく、冒頭に.を付加するものとするかを真偽値として指定します。デフォルトはfalseです。. arrayLimit・・・サブキーをパースした結果が配列となる最大の数値を指定します。デフォルトは20です。. parseArrays・・・サブキーの配列へのパースを有効にするかを真偽値として指定します。デフォルトはtrueです。. サンプルコード1. querystring.parse関数の使用例です。. querystring-parse.js. var querystring = require(\'querystring\');. console.log(querystring.parse(\'name=%E8%B5%A4%E5%B6%BA%E5%9D%82%E5%BD%A9%E9%87%8C&property=%E3%83%84%E3%83%B3%E3%83%87%E3%83%AC&property=%E5%89%AF%E7%94%9F%E5%BE%92%E4%BC%9A%E9%95%B7&property=%E5%B0%BB&b=90&w=56&h=85\'));. 実行結果. C:\\work\\node>node querystring-parse.js. { name: \'赤嶺坂彩里\',. property: [ \'ツンデレ\', \'副生徒会長\', \'尻\' ],. b: \'90\',. w: \'56\',. h: \'85\' }. サンプルコード2. qs.parse関数の使用例です。. qs-parse.js. varqs = require(\'qs\');. console.log(qs.parse(\'char[name]=%E8%B5%A4%E5%B6%BA%E5%9D%82%E5%BD%A9%E9%87%8C&char[property]=%E3%83%84%E3%83%B3%E3%83%87%E3%83%AC&char[property]=%E5%89%AF%E7%94%9F%E5%BE%92%E4%BC%9A%E9%95%B7&char[property]=%E5%B0%BB&char[b]=90&char[w]=56&char[h]=85\'));. 使用パッケージ. qs. npm install qsでインストールします。. 実行結果. C:\\work\\node>node qs-parse.js. { char:. { name: \'赤嶺坂彩里\',. property: [ \'ツンデレ\', \'副生徒会長\', \'尻\' ],. b: \'90\',. w: \'56\',. h: \'85\' } }. 関連. Node.js入門. pizyumi. プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。. スポンサーリンク. (adsbygoogle = window.adsbygoogle || []).push({});. (adsbygoogle = window.adsbygoogle || []).push({});. -Node.js. Twitter. Facebook. Google+. Pocket. B!はてブ. LINE. Message コメントをキャンセル. メールアドレスが公開されることはありません。 * が付いている欄は必須項目ですコメント 名前 *. メールアドレス *. ウェブサイト. 関連記事. Node.jsでフォルダの直下にある特定の拡張子のファイルのリストを取得する. 目次1 サンプルコード12 サンプルコード23 関連 フォルダの直下にある特定の .... cheerioの使い方――HTML要素のHTMLを取得する. 目次1 HTMLの取得2 サンプルコード12.1 cheerio-html.js .... Node.jsでスタックトレースのフレームの最大数を設定する. 目次1 サンプルコード12 サンプルコード23 サンプルコード34 関連 スタッ .... Node.js+jsdom+D3によるDOMの使用(9)プロパティの取得と設定. 目次1 プロパティの取得2 プロパティの設定3 サンプルコード13.1 d3-p .... Node.jsで配列を非同期的に集計する. 目次1 async.reduce関数とasync.reduceRight関数1. .... PREV. ECMAScript 6の新機能(7)イテラブル. NEXT. ディクテーションの実例44 利益率について. (adsbygoogle = window.adsbygoogle || []).push({});. 購読する. 特集. expressモジュールによるHTTPサーバ. httpモジュールによるHTTPサーバ. Node.js+jsdom+D3によるDOMの使用. Node.jsで始めるプログラミング入門講座. Node.jsに関する記事一覧. Node.js入門. Node.js入門 クライアント・サーバ編. SVG入門. NEW POST. ディクテーションの実例287 EBITDAについて. EBITDAについて説明している下の動画でディクテーションをしてみました。 EB .... ディクテーションの実例286 債務証書について. 債務証書について説明している下の動画でディクテーションをしてみました。 Debe .... サーバサイドウェブ開発基礎 HTTP詳説 認証. 目次1 Basic認証2 Digest認証3 Authentication-In .... Node.jsでファイルやフォルダが存在するかチェックする. 目次1非同期的なチェック2 同期的なチェック3 使い分け4 注意事項5 サンプ .... ディクテーションの実例285 貢献利益について. 貢献利益について説明している下の動画でディクテーションをしてみました。Cont .... 人気記事. ブロックチェーンにできること、できないこと. Node.jsでフォルダの直下にあるファイルのリストを取得する. Node.jsでデータの文字コードを変換する. Node.jsでテキストファイルやバイナリファイルにデータを書き込む. Node.jsでテキストファイルやバイナリファイルのデータを読み込む. Node.jsでCSVデータやTSVデータをパースする. Node.jsでグローバル変数やグローバル関数を使用する. Node.jsで子プロセスの標準入出力を処理する. Node.jsでプログラムを終了する. Node.jsでフォルダの直下にあるファイルやフォルダのリストを取得する. カテゴリー. bitcoin (3). d3.js (19). ecmascript 2015 (28). ecmascript 6 (28). express (2). FX (1). Git (6). http (13). java (2). Javascript (30). Node.js (257). npm (4). scala (2). svg (5). web (22). アクセスアップ (2). ブログ運営 (2). プログラマ (1). プログラミング (12). ローグライクゲーム (1). 仕事効率化 (1). 夢 (5). 寄稿 (10). 暗号通貨 (7). 未分類 (11). 株 (1). 相場 (1). 英語 (287). 講座 (11). 開発 (5). アーカイブ. 2017年1月 (38). 2016年12月 (63). 2016年11月 (60). 2016年10月 (62). 2016年9月 (63). 2016年8月 (62). 2016年7月 (62). 2016年6月 (60). 2016年5月 (61). 2016年4月 (57). 2016年3月 (27). 2016年2月 (28). 2016年1月 (4). expressモジュールによるHTTPサーバhttpモジュールによるHTTPサーバNode.js+jsdom+D3によるDOMの使用Node.jsで始めるプログラミング入門講座Node.jsに関する記事一覧Node.js入門Node.js入門 クライアント・サーバ編SVG入門. Node.jsでクエリ文字列をパースする. 「情報を制する者は世界を制す」をモットーに様々な情報を提供することを目指すブログです。現在はプログラミング関連情報が多めですが、投資関連情報も取り扱っていきたいです。. Copyright©. 情報アイランド ,. 2017 All Rights Reserved..',
  favicon: undefined,
  description: 'クエリ文字列とはURI(URL)のクエリ部分のことです。 URI(URL)のクエリ部分とは?ウェブ開発者なら必ず知っておくべき基礎知識(2) URI(URL)の構文URI(URL)には下のような構成要素を特定の区切り文字を使用して順番に記述します。 スキーム ホスト ポート パス クエリ フラグメント',
  keywords: 'querystring.parse',
  lang: 'ja',
  canonicalLink: 'http://info-i.net/querystring-parse',
  tags: [],
  image: 'http://info-i.net/wp-content/uploads/2016/01/screenshot.1.jpg',
  videos: [],
  links: [],
  text: '' }

関連

pizyumi
プログラミング歴19年のベテランプログラマー。業務システム全般何でも作れます。現在はWeb系の技術を勉強中。
スポンサーリンク

-Node.js