102 votes

Comment analyser une page HTML avec Node.js ?

Je dois analyser (côté serveur) de grandes quantités de pages HTML.
Nous sommes tous d'accord pour dire que les expressions génériques ne sont pas la solution.
Il me semble que le javascript est le moyen natif d'analyser une page HTML, mais cette hypothèse repose sur le fait que le code côté serveur dispose de toutes les capacités DOM du javascript à l'intérieur d'un navigateur.

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

92voto

kzh Points 5098

Vous pouvez utiliser le npm modules jsdom y analyseur html pour créer et analyser un DOM en Node.JS.

D'autres options sont possibles :

  • BeautifulSoup pour python
  • vous pouvez vous convertir html à xhtml et utiliser XSLT
  • HTMLAgilityPack pour .NET
  • CsQuery pour .NET (mon nouveau préféré)
  • Les moteurs JS spidermonkey et rhino prennent en charge E4X de manière native. Cela peut être utile, seulement si vous convertissez votre html en xhtml.

Parmi toutes ces options, je préfère utiliser l'option Node.js, parce qu'elle utilise les méthodes d'accès au DOM standard du W3C et que je peux réutiliser le code à la fois sur le client et sur le serveur. J'aurais aimé que les méthodes de BeautifulSoup soient plus proches du DOM du W3C, et je pense que convertir votre HTML en XHTML pour écrire du XSLT est tout simplement sadique.

3 votes

Qu'entendez-vous par "bon" ? Fiable, rapide, facile ? Avec ces deux éléments, il est suffisamment robuste pour que vous puissiez utiliser jQuery côté serveur si vous le souhaitez .

1 votes

@kzh La fiabilité et la facilité sont plus importantes pour moi que le fait que le processus se termine dans une heure ou un jour.

0 votes

Je dirais que l'option nœud est fiable et qu'elle est certainement facile à utiliser si vous êtes déjà habitué au DOM.

65voto

Meekohi Points 646

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

Syntaxe familière : Cheerio implémente un sous-ensemble du noyau de jQuery. Cheerio supprime toutes les incohérences du DOM et les déchets du navigateur de la bibliothèque jQuery révélant ainsi sa magnifique API.

ϟ Rapide comme l'éclair : Cheerio fonctionne avec une très s très simple et cohérent. Par conséquent, l'analyse, la manipulation et le rendu sont incroyablement incroyablement efficaces. Des tests préliminaires de bout en bout suggèrent que cheerio est environ 8 fois plus rapide que JSDOM.

❁ D'une souplesse folle : Cheerio s'enroule autour de l'indulgence de @FB55 htmlparser de @FB55. Cheerio peut analyser presque n'importe quel document HTML ou XML.

9 votes

Mais elle ne construit pas le DOM et ne permet pas XPath. La syntaxe de jQuery est certainement un inconvénient de cette bibliothèque.

2 votes

@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 type jQuery est un avantage, mais si votre application nécessite de manipuler le DOM côté serveur, vous préférerez peut-être essayer jsdom.

0 votes

jsdom est trop lent pour cela :/

6voto

esp Points 1051

Htmlparser2 de FB55 semble être une bonne alternative.

4 votes

Et que faire avec ce format de retour ? Écrire un tas de boucles "for" et de parcours d'arbres ?

0 votes

Vous pouvez vous enregistrer pour ouvrir/fermer des événements de tags, donc selon ce que vous voulez, c'est une très bonne alternative, je pense.

0 votes

@polkovnikov.ph Il y a aussi domutils du même auteur qui travaille avec le format retourné 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. Il n'y a pas de documentation, mais le code source est très clair - tout fonctionne comme on peut s'y attendre.

2voto

Yarek T Points 3105

Jsdom est trop strict pour faire de vraies choses de type screen scraping, mais beautifulsoup ne s'étouffe pas sur du mauvais balisage.

node-soupselect est un portage de beautifulsoup de python en nodejs, et il fonctionne à merveille

0voto

josh3736 Points 41911

En .NET, il y a la fonction Pack Agilité HTML qui est une bibliothèque d'analyse HTML extrêmement solide.

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X