2017-08-21 1 views
0

Je développe une application Node ExpressJS, qui doit explorer un document HTML, contenant une structure SVG en ligne (SVG en tant que balise HTML, définissant un graphique SVG).NodeJS: Analyse HTML HTML et graphiques SVG en ligne avec Cheerio

Cette structure SVG contient beaucoup de "sous-étiquettes" de type texte, les attributs d'un texte interne que je veux extraire, en utilisant Cheerio. Malheureusement, mon application Node se bloque une fois qu'elle a lu les valeurs d'attribut d'un des attributs de texte SVG. Trouvez le message d'erreur ci-dessous; Malheureusement, ce n'est pas très significatif. Il se bloque à la fois sur les plateformes Windows et Linux. En utilisant les mêmes sélecteurs avec jQuery pur et JS dans un environnement de navigateur réel, pour extraire les données fonctionne bien, il semble que ce soit Cheerio. Existe-t-il une autre façon d'analyser les structures SVG en ligne?

Message d'erreur:

npm ERR! Windows_NT 10.0.15063 
npm ERR! argv "<path to node executable>" "<path to node modues>\\npm\\bin\\npm-cli.js" "start" 
npm ERR! node v6.11.2 
npm ERR! npm v4.1.1 
npm ERR! code ELIFECYCLE 
npm ERR! [email protected] start: `node ./bin/www` 
npm ERR! Exit status 1 
npm ERR! 
npm ERR! Failed at the [email protected] start script 'node ./bin/www'. 
npm ERR! Make sure you have the latest version of node.js and npm installed. 
[...] 
+0

Je suppose que nous avons besoin de voir votre code et un exemple de document pour vraiment vous aider avec cela. – Sirko

Répondre

0

Je trouve que la raison de l'échec réside dans mon application, pas dans Cheerios. Ma mise en œuvre supposait un véritable DOM navigateur; bien sûr ce n'est pas le cas sur NodeJS.

Dans mon cas, j'avais une gamme de fermeture de tri

jQuery(selector).toArray().sort(function(a, b){ 
     var aVal = parseInt(a.getAttribute(attrName)), 
      bVal = parseInt(b.getAttribute(attrName)); 
     return aVal - bVal; 
}) 

qui a bien fonctionné dans un vrai navigateur et réel jQuery, mais a échoué sur NodeJS à l'aide Cheerios.

Je réécrit mon code pour « re-jQueryfy » l'élément sélectionné à l'intérieur de la fermeture de tri, en utilisant jQuery(a).attr(attrName), au lieu de a.getAttribute(attrName):

jQuery(selector).toArray().sort(function(a, b){ 
    var aVal = parseInt(jQuery(a).attr(attrName)), 
     bVal = parseInt(jQuery(b).attr(attrName)); 
    return aVal - bVal; 
}); 

Je suppose que la raison se trouve dans NodeJS elle-même, pas Cheerios, car il n'existe pas de DOM disponible, avec des éléments sélectionnables prenant en charge la fonction getAttribute.