Come posso analizzare una pagina HTML con Node.js


92

Ho bisogno di analizzare (lato server) grandi quantità di pagine HTML.
Siamo tutti d'accordo che regexp non è la strada da percorrere qui.
Mi sembra che javascript sia il modo nativo di analizzare una pagina HTML, ma questa ipotesi si basa sul codice lato server che ha tutte le capacità DOM che javascript ha all'interno di un browser.

Node.js ha questa capacità integrata?
Esiste un approccio migliore a questo problema, analizzando l'HTML sul lato server?

Risposte:


87

È possibile utilizzare il NPM moduli jsdom e HTMLParser per creare e analizzare un DOM in Node.JS.

Altre opzioni includono:

  • BeautifulSoup per python
  • puoi convertirti html in xhtml e usare XSLT
  • HTMLAgilityPack per .NET
  • CsQuery per .NET (il mio nuovo preferito)
  • I motori Spidermonkey e Rhino JS hanno il supporto nativo E4X. Questo può essere utile, solo se converti il ​​tuo HTML in xhtml.

Tra tutte queste opzioni, preferisco utilizzare l'opzione Node.js, perché utilizza i metodi di accesso DOM W3C standard e posso riutilizzare il codice sia sul client che sul server. Vorrei che i metodi di BeautifulSoup fossero più simili al dominio del W3C e penso che convertire il tuo HTML in XHTML per scrivere XSLT sia semplicemente sadico.


3
Cosa intendi per buono? Affidabile, veloce, facile? Bene con questi due, è abbastanza robusto da poter utilizzare jQuery lato server se lo desideri .
kzh

1
@kzh Affidabile e facile sono più importanti per me se il processo termina in un'ora o un giorno.
Itay Moav -Malimovka

Direi che l'opzione node è affidabile ed è decisamente facile se sei già abituato al DOM.
kzh

Se spari per htmlparser, prova prima con github.com/fb55/node-htmlparser . Sembra essere una versione rielaborata ed è mantenuta più attivamente.
cburgmer

Ho cercato su Internet ma non riesco a trovare un buon tutorial per htmlparser ..
songyy

62

Usa Cheerio . Non è rigoroso come jsdom ed è ottimizzato per lo scraping. Come bonus, utilizza i selettori jQuery che già conosci.

❤ Sintassi familiare: Cheerio implementa un sottoinsieme del core jQuery. Cheerio rimuove tutte le incoerenze DOM e il cruft del browser dalla libreria jQuery, rivelando la sua API davvero meravigliosa.

ϟ Incredibilmente veloce: Cheerio funziona con un modello DOM molto semplice e coerente. Di conseguenza, l'analisi, la manipolazione e il rendering sono incredibilmente efficienti. I benchmark preliminari end-to-end suggeriscono che cheerio è circa 8 volte più veloce di JSDOM.

❁ Insanely flessibile: Cheerio avvolge il perdonatore htmlparser di @ FB55. Cheerio può analizzare quasi tutti i documenti HTML o XML.


8
Ma non crea DOM e non consente XPath. La sintassi jQuery è sicuramente uno svantaggio di quella libreria.
polkovnikov.ph

2
@ polkovnikov.ph nella mia esperienza pochissime applicazioni richiedono un'analisi completa del DOM e la creazione del DOM è molto costosa rispetto alla rapida valutazione "pigra" in jQuery / Cheerio. In questo senso l'analisi in stile jQuery è un vantaggio, ma se la tua applicazione richiede la manipolazione del lato server DOM potresti preferire provare jsdom.
Meekohi

jsdomè troppo lento per quello: /
polkovnikov.ph

2
@MohamedMansour per quello che vale stiamo usando Cheerio in produzione e raschiando migliaia di pagine in pochi secondi. Ovviamente "veloce" e "lento" sono tutti relativi all'applicazione e alla larghezza di banda.
Meekohi

Non rigoroso: +1. Sintassi jQuery: +1.
cheesus


6

Htmlparser2 di FB55 sembra essere una buona alternativa.


3
E cosa si dovrebbe fare con questo formato di ritorno ? Scrivi un mucchio di cicli for e attraversamenti di alberi?
polkovnikov.ph

Puoi registrarti per aprire / chiudere eventi tag, quindi a seconda di ciò che desideri, questa è davvero un'ottima alternativa imho.
Phil

@ polkovnikov.ph Esiste anche un pacchetto domutils dello stesso autore che funziona con il formato restituito da htmlparser2 - ha molti metodi, alcuni dei quali hanno la stessa sintassi dei metodi DOM, altri sono diversi; non avrai davvero bisogno di attraversare l'oggetto manualmente. Non ci sono documenti lì, ma il codice sorgente è molto chiaro: funziona tutto come ti aspetteresti.
specialmente

non ancora, ma cosa ti impedisce di estenderlo? non è così difficile usare le funzioni che già possiede.
esp

2

jsdom è troppo rigido per fare qualsiasi tipo di raschiatura dello schermo reale, ma beautifulsoup non soffoca con un cattivo markup.

node-soupselect è un port di beautifulsoup di python in nodejs e funziona magnificamente

Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.