Como analiso uma página HTML com Node.js

92

Eu preciso analisar (lado do servidor) grandes quantidades de páginas HTML.
Todos concordamos que regexp não é a melhor opção aqui.
Parece-me que o javascript é a maneira nativa de analisar uma página HTML, mas essa suposição se baseia no código do lado do servidor com toda a capacidade DOM que o javascript tem dentro de um navegador.

O Node.js tem essa capacidade embutida?
Existe uma abordagem melhor para esse problema, analisando HTML no lado do servidor?

Itay Moav -Malimovka
fonte

Respostas:

87

Você pode usar o npm módulos jsdom e HTMLParser para criar e analisar um DOM em Node.js.

Outras opções incluem:

  • BeautifulSoup para python
  • você pode converter seu html para xhtml e usar XSLT
  • HTMLAgilityPack para .NET
  • CsQuery for .NET (meu novo favorito)
  • Os motores spidermonkey e rhino JS têm suporte nativo para E4X. Isso pode ser útil, apenas se você converter seu html em xhtml.

De todas essas opções, prefiro usar a opção Node.js, porque ela usa os métodos de acesso DOM W3C padrão e posso reutilizar o código no cliente e no servidor. Gostaria que os métodos do BeautifulSoup fossem mais semelhantes ao dom W3C, e acho que converter seu HTML em XHTML para escrever XSLT é simplesmente sádico.

kzh
fonte
3
O que você quer dizer com bom? Confiável, rápido, fácil? Bem, com esses dois, é robusto o suficiente para que você possa usar o lado do servidor jQuery, se desejar .
kzh de
1
@kzh Confiável e fácil são mais importantes para mim do que se o processo terminar em uma hora ou um dia.
Itay Moav -Malimovka
Eu diria que a opção de nó é confiável e é definitivamente fácil se você já estiver acostumado com o DOM.
kzh de
Se você deseja htmlparser, tente primeiro usar github.com/fb55/node-htmlparser . Parece ser uma versão reformulada e é mantida de forma mais ativa.
cburgmer
Eu pesquisei em toda a internet, mas não consigo encontrar um bom tutorial para htmlparser ..
songyy
62

Use Cheerio . Não é tão rígido quanto jsdom e é otimizado para raspagem. Como bônus, use os seletores jQuery que você já conhece.

❤ Sintaxe familiar: Cheerio implementa um subconjunto do núcleo do jQuery. Cheerio remove todas as inconsistências DOM e cruft de navegador da biblioteca jQuery, revelando sua API verdadeiramente linda.

ϟ Extremamente rápido: Cheerio trabalha com um modelo DOM muito simples e consistente. Como resultado, a análise, manipulação e renderização são incrivelmente eficientes. Os benchmarks de ponta a ponta preliminares sugerem que o cheerio é cerca de 8 vezes mais rápido que o JSDOM.

❁ Insanamente flexível: Cheerio envolve o complacente analisador html do @ FB55. Cheerio pode analisar quase qualquer documento HTML ou XML.

Meekohi
fonte
8
Mas não cria DOM e não permite XPath. A sintaxe do jQuery é certamente uma desvantagem dessa biblioteca.
polkovnikov.ph
2
@ polkovnikov.ph em minha experiência, muito poucos aplicativos requerem análise DOM completa, e construir o DOM é muito caro em comparação com a avaliação "preguiçosa" rápida em jQuery / Cheerio. Nesse sentido, a análise no estilo jQuery é um benefício, mas se seu aplicativo requer a manipulação do lado do servidor DOM, você pode preferir tentar jsdom.
Meekohi
jsdomé muito lento para isso: /
polkovnikov.ph
2
@MohamedMansour, pelo menos estamos usando o Cheerio na produção e raspando milhares de páginas em poucos segundos. "rápido" e "lento" são todos relativos à sua aplicação e largura de banda, é claro.
Meekohi
Não estrito: +1. Sintaxe jQuery: +1.
cheesus
6

Htmlparser2 por FB55 parece ser uma boa alternativa.

esp
fonte
3
E o que fazer com esse formato de retorno ? Escrever um monte de loops for e travessias de árvore?
polkovnikov.ph
Você pode se registrar para abrir / fechar eventos de tag, então dependendo do que você quiser, esta é uma alternativa realmente boa.
Phil
@ polkovnikov.ph Também existe o pacote domutils do mesmo autor que trabalha com o formato retornado por htmlparser2 - ele tem muitos métodos, alguns dos quais têm a mesma sintaxe dos métodos DOM, alguns são diferentes; você realmente não precisará percorrer o objeto manualmente. Não há documentos lá, mas o código-fonte é superclaro - tudo funciona como você esperaria.
especialmente
ainda não, mas o que o impede de estendê-lo? não é tão difícil usar funções que já possui.
especialmente
2

jsdom é muito restrito para fazer qualquer tipo de captura de tela real, mas beautifulsoup não se engasga com marcação ruim.

node-soupselect é um port do beautifulsoup do python para o nodejs, e funciona perfeitamente

Yarek T
fonte