Performant d'analyse de pages avec Node.js et XPath
Je suis dans le web scraping avec Node.js. Je voudrais utiliser XPath que je peux générer des semi-automatiquement avec plusieurs sortes de GUI. Le problème est que je ne peux pas trouver une façon de le faire efficacement.
jsdom
est extrêmement lent. C'est l'analyse 500KiB fichier de une minute avec une pleine charge CPU et une lourde empreinte mémoire.- Bibliothèques populaires pour analyse HTML (par exemple,
cheerio
) ni de support de XPath, ni exposer conforme au W3C DOM. - Efficace d'analyse HTML est, bien évidemment, mis en œuvre dans WebKit, donc à l'aide d'
phantom
oucasper
serait une option, mais ceux-ci exigent d'être en cours d'exécution dans une manière spéciale, et pas seulementnode <script>
. Je ne peut pas compter sur le risque impliqué par ce changement. Par exemple, il est beaucoup plus difficile de trouver comment exécuternode-inspector
avecphantom
. Spooky
est une option, mais c'est buggy assez, de sorte qu'il ne fonctionne pas sur ma machine.
Quel est le bon chemin pour parser une page HTML avec XPath alors?
- npmjs.org/package/xpath ou github.com/yaronn/xpath.js?
- Tout performant DOM mise en œuvre pour les faire fonctionner?
Vous devez vous connecter pour publier un commentaire.
Vous pouvez le faire en plusieurs étapes.
parse5
. La mauvaise partie est que le résultat n'est pas DOM. Si elle est assez rapide et le W3C-compiant.xmlserializer
qui accepte les DOM-comme des structures deparse5
comme entrée.xmldom
. Maintenant, vous avez enfin que DOM.xpath
bibliothèque s'appuie surxmldom
, vous permettant d'exécuter des requêtes XPath. Sachez que le XHTML a son propre espace de noms, et les requêtes comme//a
ne fonctionne pas.Finalement, vous obtenez quelque chose comme ceci.
var document = parser.parse(html.toString());
parvar document = parse5.parse(html.toString());
et de se débarrasser de la lignevar parser = new parse5.Parser();
(à l'aide de parse5 version 2.0.2)Libxmljs est actuellement le plus rapide de mise en œuvre (quelque chose comme un point de repère) puisque c'est seulement les liaisons vers la LibXML C-bibliothèque qui prend en charge XPath 1.0 requêtes:
Cependant, vous avez besoin de désinfecter votre HTML et de le convertir en XML. Pour cela, vous pouvez soit utiliser le HTMLTidy utilitaire de ligne de commande (
tidy -q -asxml input.html
), ou si vous souhaitez conserver le nœud-seulement, quelque chose comme xmlserializer devrait faire l'affaire.J'ai commencé à utiliser
npm install htmlstrip-natif
qui utilise un natif de la mise en œuvre pour analyser et en extraire les éléments pertinents parties html. Il prétend être 50 fois plus rapide que le pur js mise en œuvre (je n'ai pas vérifié que la demande de remboursement).Selon vos besoins, vous pouvez utiliser les balises html-bande directement, ou soulevez le code et les liaisons de vous faire propre C++ utilisé en interne dans htmlstrip indigènes
Si vous souhaitez utiliser xpath, puis utiliser le wrapper déjà disponible ici;
https://www.npmjs.org/package/xpath
xpath
de la bibliothèque doit être exécuté sur une sorte de DOM. La seule solution qui analyse le code HTML estjsdom
, qui est lent comme l'enfer. C'est le premier élément de la liste de là-haut. Avez-vous lu la question?npm xpath
de la documentation, vous verriez qu'il est conseillé d'utiliser la xmldom .Je pense que L'osmose est ce que vous cherchez.
Voici un exemple:
Il y a peut-être jamais une bonne façon d'analyser les pages HTML. Un premier examen sur le web scraping et de l'analyse des me montre que Scrapy peut être un bon candidat pour votre besoin. Il accepte à la fois les CSS et XPath sélecteurs. Dans le domaine de la Node.js, nous avons une assez nouveau module nœud-osmose. Ce module est construit sur libxmljs de sorte qu'il est censé supporter CSS et XPath bien que je n'en trouve aucun exemple à l'aide de XPath.