web-dev-qa-db-ja.com

node.jsでHTMLページをプレーンテキストに変換する方法は?

私はこれが以前に尋ねられたことを知っていますが、node.jsの良い答えを見つけることができません

フェッチされたHTMLページからプレーンテキスト(タグ、スクリプトなどなし)を抽出するには、サーバー側が必要です。

JQueryを使用してクライアント側でそれを行う方法(bodyタグの.text()コンテンツを取得する)を知っていますが、サーバー側でこれを行う方法がわかりません。

https://npmjs.org/package/html-to-text を試しましたが、これはスクリプトを処理しません。

  var htmlToText = require('html-to-text');
    var request = require('request');
    request.get(url, function (error, result) {
        var text = htmlToText.fromString(result.body, {
            wordwrap: 130
        });
    });

Phantom.jsを試しましたが、プレーンテキストを取得する方法が見つかりません。

14
metalaureate

jsdom およびjQuery(サーバー側)を使用します。

JQueryを使用すると、すべてのスクリプト、スタイル、テンプレートなどを削除してから、テキストを抽出できます。

(これはjsdomとnodeではテストされていません。Chromeでのみテストされています)

jQuery('script').remove()
jQuery('noscript').remove()
jQuery('body').text().replace(/\s{2,9999}/g, ' ')
8
hgoebl

TextVersionJS( http://textversionjs.com )を使用して、HTML文字列のプレーンテキストバージョンを生成できます。これは純粋なJavaScript(大量の正規表現を含む)であるため、ブラウザーやnode.jsでも使用できます。

このライブラリはニーズに応じて機能する場合がありますが、[〜#〜]ではありません[〜#〜]で要素のテキストを取得するのと同じです。ブラウザ。その目的は、HTMLメールのテキストバージョンを作成することです。これは、画像のようなものが含まれていることを意味します。たとえば、次のHTMLとコードスニペットがあるとします。

var textVersion = require("textversionjs");
var htmlText = "<html>" +
                    "<body>" +
                        "Lorem ipsum <a href=\"http://foo.foo\">dolor</a> sic <strong>amet</strong><br />" +
                        "Lorem ipsum <img src=\"http://foo.jpg\" alt=\"foo\" /> sic <pre>amet</pre>" +
                        "<p>Lorem ipsum dolor <br /> sic amet</p>" +
                        "<script>" +
                            "alert(\"nothing\");" +
                        "</script>" +
                    "</body>" +
                "</html>";
var plainText = textVersion.htmlToPlainText(htmlText);

変数plainTextには次の文字列が含まれます。

Lorem ipsum [dolor] (http://foo.foo) sic amet
Lorem ipsum ![foo] (http://foo.jpg) sic amet
Lorem ipsum dolor
sic amet

スクリプトタグを適切に無視することに注意してください。 ソースコード の最新バージョンはGitHubにあります。

2
Geroj

別の回答が示唆しているように、JSDOMを使用しますが、jQueryは必要ありません。これを試して:

JSDOM.fragment(sourceHtml).textContent
1
Brad