Node.jsでHTMLページを解析する方法


92

大量のHTMLページを(サーバー側で)解析する必要があります。
私たちは皆、正規表現がここに行く方法ではないことに同意します。
JavaScriptがHTMLページを解析するネイティブな方法であるように思えますが、その前提は、JavaScriptがブラウザ内で持つすべてのDOM機能を持つサーバー側のコードに依存しています。

Node.jsにはその機能が組み込まれていますか?
サーバー側でHTMLを解析するこの問題へのより良いアプローチはありますか?

回答:


87

あなたは使用することができ、NPMモジュールjsdomhtmlparser Node.JS.でDOMを作成し、解析します

その他のオプションは次のとおりです。

  • Python用のBeautifulSoup
  • あなたはあなたのhtmlをxhtmlに変換してXSLTを使うことができます
  • .NET用HTMLAgilityPack
  • CsQuery for .NET(私の新しいお気に入り)
  • spidermonkeyおよびrhino JSエンジンは、ネイティブE4Xサポートを備えています。これは、htmlをxhtmlに変換する場合にのみ役立ちます。

これらすべてのオプションの中で、標準のW3C DOMアクセサーメソッドを使用し、クライアントとサーバーの両方でコードを再利用できるため、Node.jsオプションの使用を好みます。BeautifulSoupのメソッドがW3C domに似ているといいのですが、HTMLをXHTMLに変換してXSLTを作成することは単純にサディスティックだと思います。


3
善とはどういう意味ですか?信頼性が高く、高速で、簡単ですか?これら2つで十分な堅牢性があるため、必要に応じてサーバーサイドでjQuery使用できます
kzh

1
@kzhプロセスが1時間または1日で終了する場合、信頼性と簡単さは私にとってより重要です。
Itay Moav -Malimovka

nodeオプションは信頼性が高く、DOMに慣れている場合は間違いなく簡単です。
KZH

あなたがhtmlparserのために撮影すると、一緒に行くしてみてくださいgithub.com/fb55/node-htmlparser最初。作り直されたバージョンのようで、より積極的にメンテナンスされています。
cburgmer 2012

私はすべてインターネット上で検索けどhtmlparser ..ための良いチュートリアルを見つけることができません
songyy

62

Cheerioを使用します。jsdomほど厳密ではなく、スクレイピング用に最適化されています。おまけとして、すでに知っているjQueryセレクターを使用します。

❤使い慣れた構文:CheerioはコアjQueryのサブセットを実装します。Cheerioは、jQueryライブラリからすべてのDOMの不整合とブラウザーの残骸を取り除き、本当にゴージャスなAPIを明らかにします。

ϟ驚くほど高速:Cheerioは、非常にシンプルで一貫性のあるDOMモデルで動作します。その結果、解析、操作、およびレンダリングは非常に効率的です。暫定的なエンドツーエンドのベンチマークは、cheerioがJSDOMよりも約8倍速いことを示唆しています。

❁めちゃくちゃ柔軟:Cheerioは@ FB55の寛容なhtmlparserをラップします。Cheerioは、ほぼすべてのHTMLまたはXMLドキュメントを解析できます。


8
しかし、DOMを構築せず、XPathを許可しません。jQuery構文は確かにそのライブラリの欠点です。
polkovnikov.ph 2014

2
@ polkovnikov.ph私の経験では、完全なDOM解析を必要とするアプリケーションはほとんどなく、DOMの構築はjQuery / Cheerioでの高速な「遅延」評価に比べて非常に高価です。この意味で、jQueryスタイルの解析は利点ですが、アプリケーションでDOMサーバー側の操作が必要な場合は、jsdomを試してみることをお勧めします。
Meekohi 2014

jsdomそのためには遅すぎます:/
polkovnikov.ph 14

2
@MohamedMansourは、生産でCheerioを使用し、数秒で数千のページをスクレイピングする価値があるものです。もちろん、「高速」と「低速」はすべて、アプリケーションと帯域幅に関連しています。
Meekohi、2016

非厳密:+1。jQuery構文:+1。
cheesus


6

FB55によるHtmlparser2は良い代替手段のようです。


3
そして、この戻り形式をどうすればよいですか?forループとツリートラバーサルの束を書きますか?
polkovnikov.ph 2014

オープン/クローズのタグイベントに登録できるため、必要に応じて、これは非常に優れた代替方法です。
フィル

@ polkovnikov.phまた、htmlparser2から返された形式で動作する同じ作者によるdomutilsパッケージもあります。多くのメソッドがあり、その一部はDOMメソッドと同じ構文を持ち、一部は異なっています。オブジェクトを手動でトラバースする必要はありません。そこにドキュメントはありませんが、ソースコードは非常に明確です-それはすべてあなたが期待するように機能します。
特に

まだではありませんが、それを拡張する理由は何ですか?すでに持っている機能を使うのはそれほど難しいことではありません。
esp、2015年

2

jsdomは、実際の画面スクレイピングなどを行うには厳格すぎますが、beautifulsoupは悪いマークアップを抑制しません。

node-soupselectは、Pythonのbeautifulsoupをnodejsに移植したもので、美しく機能します

弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.