zurück zum Artikel

Ich kenne was, was Du nicht kennst: Cheerio

Golo Roden

Webseiten zu analysieren ist eine gÀngige Anforderung: Es lÀsst sich beispielsweise nutzen, um Links zu validieren, Bilder zu extrahieren oder Preise zu analysieren. Die Herausforderung dabei liegt im Parsen von HTML-Dateien und dem Traversieren des DOMs. Das Modul Cheerio schafft Abhilfe.

Webseiten zu analysieren ist eine gÀngige Anforderung: Es lÀsst sich beispielsweise nutzen, um Links zu validieren, Bilder zu extrahieren oder Preise zu analysieren. Die Herausforderung dabei liegt im Parsen von HTML-Dateien und dem Traversieren des DOMs. Das Modul Cheerio schafft Abhilfe.

Mehr Infos

Neue Artikelserie

"Ich kenne was, was Du nicht kennst" ist eine gemeinsame Serie von Golo Roden und Philip Ackermann [1], in der die beiden regelmĂ€ĂŸig Module fĂŒr JavaScript und Node.js vorstellen.

Das Modul Cheerio [2] implementiert den serverseitig sinnvollen Kern von jQuery und stellt ihn fĂŒr Node.js zur VerfĂŒgung. Das erlaubt dem Entwickler, die aus dem Webbrowser bekannten Abfragemöglichkeiten auch auf dem Server zu verwenden.

Um den Titel einer Webseite mit jQuery zu extrahieren, genĂŒgt der Aufruf der Funktion $ mit dem passenden Selektor:

let title = $('title').text();

Cheerio verspricht, den gleichen Code auch auf dem Server ausfĂŒhren zu können. Dazu ist zunĂ€chst Cheerio zu installieren, was auf dem gewohnten Weg mit Hilfe von npm in den Kontext der Anwendung erfolgt:

$ npm install cheerio

Danach lĂ€sst sich das Modul laden, wozu wie ĂŒblich die require-Funktion dient:

var cheerio = require('cheerio');

Das cheerio-Objekt stellt anschließend die load-Funktion zur VerfĂŒgung, mit der sich HTML-Quellcode laden lĂ€sst. Das ist im Unterschied zu jQuery explizit erforderlich, da auf dem Server kein standardmĂ€ĂŸig vorhandenes DOM zur VerfĂŒgung steht.

Da der Quellcode in der Regel nicht bereits vorliegen wird, empfiehlt sich hierfĂŒr der Einsatz eines weiteren Moduls wie request [3]:

'use strict';

let cheerio = require('cheerio'),
request = require('request');

request('http://www.thenativeweb.io', function (err, res, body) {
// ...
});

Falls beim Abrufen der Webseite kein Fehler aufgetreten ist, enthÀlt der Parameter body den bereits fertig geladenen Quellcode: Das Verwalten des zugrunde liegenden Streams entfÀllt in dem Fall.

Anschließend lĂ€sst sich der Titel der Webseite mit dem bereits erwĂ€hnten Code-Schnipsel auslesen:

let title = $('title').text();

Auf dem gleichen Weg sind jedoch auch komplexere Abfragen möglich: Um beispielsweise alle Bildpfade zu extrahieren, muss man zunÀchst alle img-Elemente ermitteln:

let images = $('img');

Die Variable images enthĂ€lt anschließend nicht, wie man vielleicht vermuten wĂŒrde, ein Array, sondern ein Objekt, dessen Elemente durchnummeriert sind. ZusĂ€tzlich enthĂ€lt es jedoch einige weitere Eigenschaften, weshalb der typische Weg, alle SchlĂŒssel eines Objekts zu durchlaufen, nicht das gewĂŒnschte Ergebnis zurĂŒckgibt:

Object.keys(images).forEach(function (key) {
// ...
});

Da das Objekt ĂŒber eine length-Eigenschaft verfĂŒgt, lĂ€sst es sich wie ein Array verwenden:

for (let i = 0; i < images.length; i++) {
let image = images[i];
// ...
}

Der elegantere Weg ist allerdings, die Funktionen each oder map zu verwenden, die Cheerio zur VerfĂŒgung stellt. In der Funktion, die each als Callback ĂŒbergeben wird, zeigt this dann auf das jeweilige Element. Um beispielsweise alle Bildpfade zu ermitteln, genĂŒgt es dann, das src-Attribut des Elements abzufragen:

images.each(function () {
let source = $(this).attr('src');
// ...
});

Der Aufruf liefert nun wie gewĂŒnscht die Pfade, die sich dann beispielsweise verwenden lassen, um die Bilder herunterzuladen.

Wie jQuery kennt Cheerio allerdings nicht nur Funktionen zum Auslesen, sondern auch zum VerĂ€ndern des DOMs. Hierzu stehen die ĂŒblichen Funktionen von jQuery zur VerfĂŒgung, beispielsweise append oder remove. Wichtig hierbei ist, am Ende aus dem manipulierten DOM wiederum gĂŒltigen HTML-Quelltext zu erhalten. Dazu dient die Funktion html, die am Objekt $ aufgerufen werden muss. Soll XML-konformer Quelltext erzeugt werden, ist stattdessen die Funktion xml zu verwenden:

console.log($.xml());

Ist zum VerĂ€ndern des DOMs der Zugriff auf den obersten Knoten erforderlich, gelingt das mit dem Aufruf der Funktion root, die ebenfalls am $-Objekt zur VerfĂŒgung steht.

Einen Überblick ĂŒber alle verfĂŒgbaren Funktionen liefert die ausfĂŒhrliche Dokumentation [4] auf der Webseite des Projekts.

tl;dr: Cheerio ist ein Node.jsModul, das den Kern von jQuery auf den Server bringt. Es ermöglicht das serverseitige Analysieren und VerÀndern von Webseiten mit der gleichen API wie mit jQuery im Webbrowser. ( [5])


URL dieses Artikels:
https://www.heise.de/-2651656

Links in diesem Artikel:
[1] http://www.heise.de/developer/developer_redakteur_2548746.html
[2] https://github.com/cheeriojs/cheerio
[3] https://github.com/request/request
[4] https://github.com/cheeriojs/cheerio
[5] mailto:webmaster@goloroden.de