Node.js: effettuare il parsing di una pagina HTML remota

In Node.js è semplice effettuare il parsing di una pagina HTML remota.

Dobbiamo installare due moduli:


npm install request --save
npm install cheerio --save

Il nostro codice è il seguente:


'use strict';

const request = require('request');
const cheerio = require('cheerio');
const url = 'http://www.html.it/autore/gabroman/';
const fs = require('fs');

const getPage = ( cb ) => {
    request(url, {
        timeout: 3000
    }, (error, response, body) => {
        if(!error) {
            cb(body);
        }
    });
};

const savePage = ( data ) => {
    let contents = "'use strict';" + '\n\n';
        contents += 'const HTMLItArticles = ';
        contents += JSON.stringify( data ) + ';\n\n';
        contents += 'module.exports = HTMLItArticles;';

        fs.writeFileSync(__dirname + '/articles.js', contents);
};

const parsePage = ( data ) => {
    const $ = cheerio.load(data);
    let output = [];
    $( ".author-article" ).each( (i, elem ) => {
        let $a = $(elem).find( 'a' );
        let datum = {
            title: $a.text(),
            url: $a.attr( 'href' )
        };
        output.push(datum);
    });
    return output;
};

getPage() esegue la richiesta remota e restituisce la stringa HTML ricevuta. Il suo output viene passato a parsePage() che ne effettua il parsing in stile jQuery.

savePage() crea un file JavaScript con i dati ottenuti. Eseguiamo quindi il nostro codice:


getPage( (html) => {
    let data = parsePage( html );
    savePage(data);
});

Il risultato è il seguente.


    'use strict';

    const HTMLItArticles = [{
        "title": "WooCommerce REST API: sincronizzazione con NodeJS e MongoDB",
        "url": "http://www.html.it/guide/woocommerce-rest-api-sincronizzazione-con-nodejs-e-mongodb/?cref="
    }, {
        "title": "Creare Plugin per WordPress, la guida",
        "url": "http://www.html.it/guide/creare-plugin-per-wordpress/?cref=development"
    }, {
        "title": "Connettere WordPress e Excel grazie a Python",
        "url": "http://www.html.it/articoli/wordpress-dialogo-con-python-tramite-api-xml-rpc/?cref=development"
    }, {
        "title": "WordPress e la gestione degli errori",
        "url": "http://www.html.it/articoli/wordpress-e-la-gestione-degli-errori/?cref=development"
    }, {
        "title": "WordPress: utilizzo dei tag condizionali",
        "url": "http://www.html.it/articoli/wordpress-utilizzo-dei-tag-condizionali/?cref=development"
    }, {
        "title": "WordPress: eseguire la migrazione di un sito esistente",
        "url": "http://www.html.it/articoli/wordpress-eseguire-la-migrazione-di-un-sito-esistente/?cref=development"
    }, {
        "title": "WordPress e gli “attachments”",
        "url": "http://www.html.it/articoli/wordpress-gestire-i-loop-degli-allegati/?cref=development"
    }, {
        "title": "WordPress: aggiungere una sezione portfolio a TwentyFourteen",
        "url": "http://www.html.it/articoli/wordpress-aggiungere-una-sezione-portfolio-a-twentyfourteen/?cref=development"
    }, {
        "title": "Pulsanti social per WordPress con jQuery",
        "url": "http://www.html.it/articoli/definire-una-classe-per-gestire-le-condivisioni-social-con-wordpress-2/?cref=development"
    }, {
        "title": "Creare una classe per gestire gli shortcode di WordPress",
        "url": "http://www.html.it/articoli/creare-una-classe-per-gestire-gli-shortcode-di-wordpress/?cref=development"
    }];
    
    module.exports = HTMLItArticles;

Torna su