¿Cómo analizo una página HTML con Node.js?

92

Necesito analizar (del lado del servidor) grandes cantidades de páginas HTML.
Todos estamos de acuerdo en que regexp no es el camino a seguir aquí.
Me parece que javascript es la forma nativa de analizar una página HTML, pero esa suposición se basa en que el código del lado del servidor tiene toda la capacidad DOM que javascript tiene dentro de un navegador.

¿Node.js tiene esa capacidad incorporada?
¿Existe un mejor enfoque para este problema, analizando HTML en el lado del servidor?

Itay Moav -Malimovka
fuente

Respuestas:

87

Se puede utilizar el NPM módulos jsdom y HTMLParser para crear y analizar una de DOM en Node.js.

Otras opciones incluyen:

  • BeautifulSoup para pitón
  • puede convertir su html a xhtml y usar XSLT
  • HTMLAgilityPack para .NET
  • CsQuery para .NET (mi nuevo favorito)
  • Los motores JS de spidermonkey y rhino tienen soporte nativo para E4X. Esto puede ser útil, solo si convierte su html a xhtml.

De todas estas opciones, prefiero usar la opción Node.js, porque usa los métodos de acceso DOM estándar de W3C y puedo reutilizar el código tanto en el cliente como en el servidor. Desearía que los métodos de BeautifulSoup fueran más similares a los de W3C dom, y creo que convertir tu HTML a XHTML para escribir XSLT es simplemente sádico.

kzh
fuente
3
¿A qué te refieres con bueno? ¿Confiable, rápido, fácil? Bueno, con estos dos, es lo suficientemente robusto como para que pueda usar jQuery en el servidor si lo desea .
2011
1
@kzh Fiable y fácil son más importantes para mí que si el proceso termina en una hora o en un día.
Itay Moav -Malimovka
Yo diría que la opción de nodo es confiable y definitivamente fácil si ya está acostumbrado al DOM.
kzh
Si busca htmlparser, intente ir primero con github.com/fb55/node-htmlparser . Parece ser una versión reelaborada y se mantiene más activamente.
cburgmer
Busqué en todo Internet pero no puedo encontrar un buen tutorial para htmlparser ..
songyy
62

Utilice Cheerio . No es tan estricto como jsdom y está optimizado para raspar. Como beneficio adicional, usa los selectores de jQuery que ya conoces.

❤ Sintaxis familiar: Cheerio implementa un subconjunto del núcleo jQuery. Cheerio elimina todas las inconsistencias DOM y el cruft del navegador de la biblioteca jQuery, revelando su API realmente hermosa.

ϟ Increíblemente rápido: Cheerio funciona con un modelo DOM muy simple y consistente. Como resultado, analizar, manipular y renderizar son increíblemente eficientes. Los puntos de referencia preliminares de un extremo a otro sugieren que cheerio es aproximadamente 8 veces más rápido que JSDOM.

❁ Increíblemente flexible: Cheerio envuelve el htmlparser indulgente de @ FB55. Cheerio puede analizar casi cualquier documento HTML o XML.

Meekohi
fuente
8
Pero no crea DOM y no permite XPath. La sintaxis de jQuery es sin duda una desventaja de esa biblioteca.
polkovnikov.ph
2
@ polkovnikov.ph, en mi experiencia, muy pocas aplicaciones requieren un análisis completo de DOM, y construir el DOM es muy caro en comparación con la evaluación rápida "perezosa" en jQuery / Cheerio. En este sentido, el análisis de estilo jQuery es un beneficio, pero si su aplicación requiere manipular el lado del servidor DOM, es posible que prefiera probar jsdom.
Meekohi
jsdomes demasiado lento para eso: /
polkovnikov.ph
2
@MohamedMansour por lo que vale, estamos usando Cheerio en producción y raspando miles de páginas en unos pocos segundos. "rápido" y "lento" son todos relativos a su aplicación y ancho de banda, por supuesto.
Meekohi
No estricto: +1. Sintaxis de jQuery: +1.
cheesus
6

Htmlparser2 de FB55 parece ser una buena alternativa.

esp
fuente
3
¿Y qué se debe hacer con este formato de devolución ? ¿Escribir un montón de bucles for y recorridos de árboles?
polkovnikov.ph
Puede registrarse para abrir / cerrar eventos de etiqueta, por lo que, dependiendo de lo que desee, esta es una muy buena alternativa en mi humilde opinión.
Phil
@ polkovnikov.ph También hay un paquete domutils del mismo autor que trabaja con el formato devuelto por htmlparser2 - tiene muchos métodos, algunos de los cuales tienen la misma sintaxis que los métodos DOM, otros son diferentes; realmente no necesitará atravesar el objeto manualmente. No hay documentos allí, pero el código fuente es muy claro: todo funciona como es de esperar.
especialmente
todavía no, pero ¿qué te impide extenderlo? no es tan difícil usar las funciones que ya tiene.
especialmente
2

jsdom es demasiado estricto para hacer cualquier tipo de raspado de pantalla real, pero beautifulsoup no se atraganta con un marcado incorrecto.

node-soupselect es un puerto de beautifulsoup de python en nodejs, y funciona a la perfección

Yarek T
fuente