Comment analyser une page HTML avec Node.js

92

J'ai besoin d'analyser (côté serveur) de grandes quantités de pages HTML.
Nous sommes tous d'accord pour dire que l'expression rationnelle n'est pas la voie à suivre ici.
Il me semble que javascript est la manière native d'analyser une page HTML, mais cette hypothèse repose sur le code côté serveur ayant toutes les capacités DOM que javascript a dans un navigateur.

Node.js a-t-il cette capacité intégrée?
Existe-t-il une meilleure approche à ce problème, en analysant le HTML côté serveur?

Itay Moav -Malimovka
la source

Réponses:

87

Vous pouvez utiliser les modules npm jsdom et htmlparser pour créer et analyser un DOM dans Node.JS.

D'autres options incluent:

  • BeautifulSoup pour python
  • vous pouvez convertir votre HTML en xhtml et utiliser XSLT
  • HTMLAgilityPack pour .NET
  • CsQuery pour .NET (mon nouveau favori)
  • Les moteurs JS spidermonkey et rhino ont un support natif E4X. Cela peut être utile, uniquement si vous convertissez votre html en xhtml.

Parmi toutes ces options, je préfère utiliser l'option Node.js, car elle utilise les méthodes d'accès DOM standard du W3C et je peux réutiliser le code à la fois sur le client et le serveur. Je souhaite que les méthodes de BeautifulSoup soient plus similaires à celles du W3C dom, et je pense que la conversion de votre HTML en XHTML pour écrire XSLT est tout simplement sadique.

kzh
la source
3
Qu'entendez-vous par bon? Fiable, rapide, facile? Eh bien, avec ces deux, il est suffisamment robuste pour que vous puissiez utiliser jQuery serveride si vous le souhaitez .
kzh
1
@kzh Fiable et facile sont plus importants pour moi que si le processus se termine dans une heure ou un jour.
Itay Moav -Malimovka
Je dirais que l'option node est fiable et est certainement facile si vous êtes déjà habitué au DOM.
kzh le
Si vous recherchez htmlparser, essayez d' abord d' utiliser github.com/fb55/node-htmlparser . Cela semble être une version retravaillée et est plus activement maintenue.
cburgmer
J'ai cherché partout sur Internet mais je ne trouve pas de bon tutoriel pour htmlparser ..
songyy
62

Utilisez Cheerio . Ce n'est pas aussi strict que jsdom et est optimisé pour le scraping. En prime, utilise les sélecteurs jQuery que vous connaissez déjà.

❤ Syntaxe familière: Cheerio implémente un sous-ensemble de jQuery de base. Cheerio supprime toutes les incohérences DOM et la cruauté du navigateur de la bibliothèque jQuery, révélant son API vraiment magnifique.

ϟ Extrêmement rapide: Cheerio fonctionne avec un modèle DOM très simple et cohérent. En conséquence, l'analyse, la manipulation et le rendu sont incroyablement efficaces. Les tests de performance préliminaires de bout en bout suggèrent que cheerio est environ 8 fois plus rapide que JSDOM.

❁ Insanely flexible: Cheerio s'enroule autour du htmlparser indulgent de @ FB55. Cheerio peut analyser presque tous les documents HTML ou XML.

Meekohi
la source
8
Mais ne construit pas DOM et n'autorise pas XPath. La syntaxe jQuery est sûrement un inconvénient de cette bibliothèque.
polkovnikov.ph
2
@ polkovnikov.ph d'après mon expérience, très peu d'applications nécessitent une analyse complète du DOM, et la construction du DOM est très coûteuse par rapport à l'évaluation rapide "paresseuse" de jQuery / Cheerio. Dans ce sens, l'analyse de style jQuery est un avantage, mais si votre application nécessite de manipuler le côté serveur DOM, vous préférerez peut-être essayer jsdom.
Meekohi
jsdomest trop lent pour cela: /
polkovnikov.ph
2
@MohamedMansour pour ce que ça vaut, nous utilisons Cheerio en production et grattons des milliers de pages en quelques secondes. «rapide» et «lent» sont tous relatifs à votre application et à votre bande passante bien sûr.
Meekohi le
Non strict: +1. Syntaxe jQuery: +1.
cheesus
6

Htmlparser2 de FB55 semble être une bonne alternative.

esp
la source
3
Et que faire avec ce format de retour ? Écrire un tas de boucles for et de traversées d'arbres?
polkovnikov.ph
Vous pouvez vous inscrire pour ouvrir / fermer des événements de balises, donc selon ce que vous voulez, c'est une très bonne alternative à mon humble avis.
Phil
@ polkovnikov.ph Il existe également un package domutils du même auteur qui fonctionne avec le format renvoyé par htmlparser2 - il a beaucoup de méthodes, dont certaines ont la même syntaxe que les méthodes DOM, d'autres sont différentes; vous n'aurez pas vraiment besoin de parcourir l'objet manuellement. Pas de documentation là-bas, mais le code source est super clair - tout fonctionne comme prévu.
esp
pas encore, mais qu'est-ce qui vous empêche de l'étendre? ce n'est pas si difficile d'utiliser les fonctions dont il dispose déjà.
esp
2

jsdom est trop strict pour faire de vraies choses de grattage d'écran, mais beautifulsoup ne s'étouffe pas avec un mauvais balisage.

node-soupselect est un portage de beautifulsoup de python dans nodejs, et cela fonctionne à merveille

Yarek T
la source