htmlparser2 vs sax vs xml2js vs cheerio
HTMLおよびXML解析ライブラリ
htmlparser2saxxml2jscheerio類似パッケージ:

HTMLおよびXML解析ライブラリ

これらのライブラリは、HTMLやXMLドキュメントを解析し、操作するためのツールです。ウェブスクレイピング、データ抽出、DOM操作など、さまざまな用途に利用されます。これらのライブラリは、異なるアプローチと機能を提供し、特定のニーズに応じて選択できます。

npmのダウンロードトレンド

3 年

GitHub Starsランキング

統計詳細

パッケージ
ダウンロード数
Stars
サイズ
Issues
公開日時
ライセンス
htmlparser257,107,5944,810306 kB211ヶ月前MIT
sax52,879,6501,13956.5 kB962ヶ月前BlueOak-1.0.0
xml2js29,736,0434,9713.44 MB2483年前MIT
cheerio16,814,12930,1261.01 MB341ヶ月前MIT

機能比較: htmlparser2 vs sax vs xml2js vs cheerio

APIの使いやすさ

  • htmlparser2:

    htmlparser2は、柔軟なAPIを持ちますが、Cheerioほど直感的ではありません。ストリーミング解析を重視しているため、特定のユースケースにおいては複雑さが増すことがあります。

  • sax:

    SAXは、イベント駆動型のアプローチを採用しており、APIはシンプルですが、コールバックベースであるため、非同期処理に慣れていない開発者には少し難しいかもしれません。

  • xml2js:

    xml2jsは、XMLをJavaScriptオブジェクトに変換するためのシンプルなAPIを提供します。これにより、XMLデータの操作が容易になり、特にJSON形式でのデータ処理が必要な場合に便利です。

  • cheerio:

    Cheerioは、jQueryに似たシンプルで直感的なAPIを提供します。これにより、HTML要素の選択や操作が容易になり、特にウェブスクレイピングにおいて迅速に作業できます。

パフォーマンス

  • htmlparser2:

    htmlparser2は、非常に高速なパーサーであり、大規模なHTMLやXMLドキュメントを効率的に処理できます。ストリーミング解析により、メモリ使用量を抑えつつ、高速な処理が可能です。

  • sax:

    SAXは、メモリ使用量が非常に少なく、大規模なXMLファイルを扱う際に最適です。イベント駆動型のアプローチにより、必要なデータのみを処理するため、パフォーマンスが向上します。

  • xml2js:

    xml2jsは、XMLをJavaScriptオブジェクトに変換する際に便利ですが、変換プロセスが重くなることがあります。特に大規模なXMLファイルを扱う場合、パフォーマンスに影響を与える可能性があります。

  • cheerio:

    Cheerioは、DOMの操作が軽量で高速です。特に小規模なHTMLドキュメントを扱う場合に優れたパフォーマンスを発揮しますが、大規模なドキュメントではメモリ使用量が増加する可能性があります。

エラーハンドリング

  • htmlparser2:

    htmlparser2は、エラーハンドリングが強力で、構文エラーを詳細に報告します。これにより、デバッグが容易になり、正確な解析が可能です。

  • sax:

    SAXは、エラーが発生した場合にイベントをトリガーしますが、エラー処理は開発者の責任となります。エラーが発生した場合の処理を適切に実装する必要があります。

  • xml2js:

    xml2jsは、XMLの不正な構文に対してエラーを返しますが、エラー処理の柔軟性は他のライブラリに比べて劣ります。エラーが発生した場合の対応を考慮する必要があります。

  • cheerio:

    Cheerioは、HTMLの不正な構文に対して比較的寛容で、エラーを無視して解析を続行します。これにより、ウェブスクレイピング時に不完全なHTMLを扱う際に便利です。

ユースケース

  • htmlparser2:

    htmlparser2は、HTMLやXMLのストリーミング解析が必要な場合に最適です。大規模なドキュメントを効率的に処理するために設計されています。

  • sax:

    SAXは、大規模なXMLファイルを扱う際に適しています。メモリ使用量を抑えつつ、リアルタイムでデータを処理する必要がある場合に選択されます。

  • xml2js:

    xml2jsは、XMLデータをJavaScriptオブジェクトに変換する必要がある場合に便利です。特に、APIからのXMLレスポンスを扱う際に役立ちます。

  • cheerio:

    Cheerioは、主にウェブスクレイピングやHTMLの操作に使用されます。jQueryに似たAPIを利用することで、迅速にデータを抽出し、操作することができます。

コミュニティとサポート

  • htmlparser2:

    htmlparser2も活発なコミュニティを持ち、ドキュメントが整備されていますが、Cheerioほどの人気はありません。

  • sax:

    SAXは、比較的古いライブラリですが、依然として使用されています。コミュニティは小さいですが、基本的なサポートはあります。

  • xml2js:

    xml2jsは、広く使用されているライブラリで、活発なコミュニティがあります。ドキュメントも充実しており、サポートが得やすいです。

  • cheerio:

    Cheerioは、広範なコミュニティと豊富なドキュメントがあり、サポートが充実しています。多くの開発者が利用しているため、問題解決が容易です。

選び方: htmlparser2 vs sax vs xml2js vs cheerio

  • htmlparser2:

    htmlparser2は、非常に高速で柔軟なHTMLおよびXMLパーサーです。ストリーミング解析が可能で、大きなドキュメントを効率的に処理したい場合に選択すべきです。

  • sax:

    SAXは、イベント駆動型のXMLパーサーで、メモリ使用量を最小限に抑えたい場合に適しています。大規模なXMLファイルを扱う際に、パフォーマンスを重視する場合に選ぶと良いでしょう。

  • xml2js:

    xml2jsは、XMLをJavaScriptオブジェクトに変換するためのライブラリで、XMLデータを簡単に操作したい場合に最適です。特に、XMLからJSON形式への変換が必要な場合に便利です。

  • cheerio:

    Cheerioは、jQueryに似たAPIを提供し、HTMLを簡単に操作したい場合に最適です。DOMの操作が直感的で、軽量なため、ウェブスクレイピングに特に適しています。

htmlparser2 のREADME

htmlparser2

NPM version Downloads Node.js CI Coverage

The fast & forgiving HTML/XML parser.

htmlparser2 is the fastest HTML parser, and takes some shortcuts to get there. If you need strict HTML spec compliance, have a look at parse5.

Installation

npm install htmlparser2

A live demo of htmlparser2 is available on AST Explorer.

Ecosystem

NameDescription
htmlparser2Fast & forgiving HTML/XML parser
domhandlerHandler for htmlparser2 that turns documents into a DOM
domutilsUtilities for working with domhandler's DOM
css-selectCSS selector engine, compatible with domhandler's DOM
cheerioThe jQuery API for domhandler's DOM
dom-serializerSerializer for domhandler's DOM

Usage

htmlparser2 itself provides a callback interface that allows consumption of documents with minimal allocations. For a more ergonomic experience, read Getting a DOM below.

import * as htmlparser2 from "htmlparser2";

const parser = new htmlparser2.Parser({
    onopentag(name, attributes) {
        /*
         * This fires when a new tag is opened.
         *
         * If you don't need an aggregated `attributes` object,
         * have a look at the `onopentagname` and `onattribute` events.
         */
        if (name === "script" && attributes.type === "text/javascript") {
            console.log("JS! Hooray!");
        }
    },
    ontext(text) {
        /*
         * Fires whenever a section of text was processed.
         *
         * Note that this can fire at any point within text and you might
         * have to stitch together multiple pieces.
         */
        console.log("-->", text);
    },
    onclosetag(tagname) {
        /*
         * Fires when a tag is closed.
         *
         * You can rely on this event only firing when you have received an
         * equivalent opening tag before. Closing tags without corresponding
         * opening tags will be ignored.
         */
        if (tagname === "script") {
            console.log("That's it?!");
        }
    },
});
parser.write(
    "Xyz <script type='text/javascript'>const foo = '<<bar>>';</script>",
);
parser.end();

Output (with multiple text events combined):

--> Xyz
JS! Hooray!
--> const foo = '<<bar>>';
That's it?!

This example only shows three of the possible events. Read more about the parser, its events and options in the wiki.

Usage with streams

While the Parser interface closely resembles Node.js streams, it's not a 100% match. Use the WritableStream interface to process a streaming input:

import { WritableStream } from "htmlparser2/WritableStream";

const parserStream = new WritableStream({
    ontext(text) {
        console.log("Streaming:", text);
    },
});

const htmlStream = fs.createReadStream("./my-file.html");
htmlStream.pipe(parserStream).on("finish", () => console.log("done"));

Getting a DOM

The DomHandler produces a DOM (document object model) that can be manipulated using the DomUtils helper.

import * as htmlparser2 from "htmlparser2";

const dom = htmlparser2.parseDocument(htmlString);

The DomHandler, while still bundled with this module, was moved to its own module. Have a look at that for further information.

Parsing Feeds

htmlparser2 makes it easy to parse RSS, RDF and Atom feeds, by providing a parseFeed method:

const feed = htmlparser2.parseFeed(content, options);

Performance

After having some artificial benchmarks for some time, @AndreasMadsen published his htmlparser-benchmark, which benchmarks HTML parses based on real-world websites.

At the time of writing, the latest versions of all supported parsers show the following performance characteristics on GitHub Actions (sourced from here):

htmlparser2        : 2.17215 ms/file ± 3.81587
node-html-parser   : 2.35983 ms/file ± 1.54487
html5parser        : 2.43468 ms/file ± 2.81501
neutron-html5parser: 2.61356 ms/file ± 1.70324
htmlparser2-dom    : 3.09034 ms/file ± 4.77033
html-dom-parser    : 3.56804 ms/file ± 5.15621
libxmljs           : 4.07490 ms/file ± 2.99869
htmljs-parser      : 6.15812 ms/file ± 7.52497
parse5             : 9.70406 ms/file ± 6.74872
htmlparser         : 15.0596 ms/file ± 89.0826
html-parser        : 28.6282 ms/file ± 22.6652
saxes              : 45.7921 ms/file ± 128.691
html5              : 120.844 ms/file ± 153.944

How does this module differ from node-htmlparser?

In 2011, this module started as a fork of the htmlparser module. htmlparser2 was rewritten multiple times and, while it maintains an API that's mostly compatible with htmlparser, the projects don't share any code anymore.

The parser now provides a callback interface inspired by sax.js (originally targeted at readabilitySAX). As a result, old handlers won't work anymore.

The DefaultHandler was renamed to clarify its purpose (to DomHandler). The old name is still available when requiring htmlparser2 and your code should work as expected.

The RssHandler was replaced with a getFeed function that takes a DomHandler DOM and returns a feed object. There is a parseFeed helper function that can be used to parse a feed from a string.

Security contact information

To report a security vulnerability, please use the Tidelift security contact. Tidelift will coordinate the fix and disclosure.

htmlparser2 for enterprise

Available as part of the Tidelift Subscription.

The maintainers of htmlparser2 and thousands of other packages are working with Tidelift to deliver commercial support and maintenance for the open source dependencies you use to build your applications. Save time, reduce risk, and improve code health, while paying the maintainers of the exact dependencies you use. Learn more.