Wie analysiere ich eine HTML-Seite mit Node.js.

92

Ich muss (serverseitig) große Mengen von HTML-Seiten analysieren.
Wir sind uns alle einig, dass Regexp nicht der richtige Weg ist.
Es scheint mir, dass Javascript die native Methode zum Parsen einer HTML-Seite ist, aber diese Annahme beruht darauf, dass der serverseitige Code alle DOM-Fähigkeiten von Javascript in einem Browser besitzt.

Hat Node.js diese Fähigkeit eingebaut?
Gibt es einen besseren Ansatz für dieses Problem, indem HTML auf der Serverseite analysiert wird?

Itay Moav-Malimovka
quelle

Antworten:

87

Mit den npm- Modulen jsdom und htmlparser können Sie ein DOM in Node.JS erstellen und analysieren.

Weitere Optionen sind:

Von all diesen Optionen bevorzuge ich die Option Node.js, da sie die Standardmethoden für W3C-DOM-Zugriff verwendet und ich Code sowohl auf dem Client als auch auf dem Server wiederverwenden kann. Ich wünschte, die Methoden von BeautifulSoup wären dem W3C-Dom ähnlicher, und ich denke, die Konvertierung Ihres HTML-Codes in XHTML zum Schreiben von XSLT ist einfach nur sadistisch.

kzh
quelle
3
Was meinst du mit gut? Zuverlässig, schnell, einfach? Mit diesen beiden ist es robust genug, sodass Sie jQuery serverseitig verwenden können, wenn Sie möchten .
kzh
1
@kzh Zuverlässig und einfach sind mir wichtiger, wenn der Prozess in einer Stunde oder einem Tag endet.
Itay Moav-Malimovka
Ich würde sagen, dass die Knotenoption zuverlässig und definitiv einfach ist, wenn Sie bereits an das DOM gewöhnt sind.
kzh
Wenn Sie für htmlparser fotografieren, versuchen Sie zuerst, github.com/fb55/node-htmlparser zu verwenden . Es scheint eine überarbeitete Version zu sein und wird aktiver gepflegt.
Cburgmer
Ich habe im ganzen Internet gesucht, kann aber kein gutes Tutorial für htmlparser finden.
songyy
62

Verwenden Sie Cheerio . Es ist nicht so streng wie jsdom und für das Scraping optimiert. Verwendet als Bonus die bereits bekannten jQuery-Selektoren.

❤ Vertraute Syntax: Cheerio implementiert eine Teilmenge der Kern-jQuery. Cheerio entfernt alle DOM-Inkonsistenzen und Browser-Cruft aus der jQuery-Bibliothek und enthüllt die wirklich großartige API.

ϟ Sehr schnell: Cheerio arbeitet mit einem sehr einfachen, konsistenten DOM-Modell. Das Parsen, Bearbeiten und Rendern ist daher unglaublich effizient. Vorläufige End-to-End-Benchmarks legen nahe, dass Cheerio etwa 8x schneller als JSDOM ist.

❁ Wahnsinnig flexibel: Cheerio wickelt sich um den verzeihenden HTML-Parser von @ FB55. Cheerio kann nahezu jedes HTML- oder XML-Dokument analysieren.

Meekohi
quelle
8
Erstellt aber kein DOM und erlaubt XPath nicht. Die jQuery-Syntax ist sicherlich ein Nachteil dieser Bibliothek.
polkovnikov.ph
2
@ polkovnikov.ph Nach meiner Erfahrung erfordern nur sehr wenige Anwendungen eine vollständige DOM-Analyse, und das Erstellen des DOM ist im Vergleich zur schnellen "faulen" Auswertung in jQuery / Cheerio sehr teuer. In diesem Sinne ist das Parsen im jQuery-Stil von Vorteil. Wenn Ihre Anwendung jedoch die DOM-Serverseite manipulieren muss, sollten Sie lieber jsdom ausprobieren.
Meekohi
jsdomist zu langsam dafür: /
polkovnikov.ph
2
@MohamedMansour für das, was es wert ist, verwenden wir Cheerio in der Produktion und kratzen in wenigen Sekunden Tausende von Seiten. "schnell" und "langsam" sind natürlich alle relativ zu Ihrer Anwendung und Bandbreite.
Meekohi
Nicht streng: +1. jQuery-Syntax: +1.
Cheesus
6

Htmlparser2 von FB55 scheint eine gute Alternative zu sein.

insb
quelle
3
Und was soll man mit diesem Rückgabeformat machen ? Ein paar For-Loops und Baumdurchquerungen schreiben?
polkovnikov.ph
Sie können sich registrieren, um Tag-Ereignisse zu öffnen / schließen. Je nachdem, was Sie möchten, ist dies imho eine wirklich gute Alternative.
Phil
@ polkovnikov.ph Es gibt auch ein domutils- Paket desselben Autors, das mit dem von htmlparser2 zurückgegebenen Format arbeitet. Es enthält viele Methoden, von denen einige dieselbe Syntax wie DOM-Methoden haben, andere unterschiedlich sind. Sie müssen das Objekt nicht wirklich manuell durchlaufen. Keine Dokumente vorhanden, aber der Quellcode ist super klar - alles funktioniert wie erwartet.
Besonders
noch nicht, aber was hält Sie davon ab, es zu erweitern? Es ist nicht so schwierig, Funktionen zu verwenden, die es bereits hat.
Besonders
2

jsdom ist zu streng, um echte Bildschirmkratzer zu machen, aber beautifulsoup verschluckt sich nicht an schlechten Markups.

Node-Soupselect ist eine Portierung von Pythons Beautifulsoup in NodeJS und funktioniert wunderbar

Yarek T.
quelle