Search code examples
javascriptnode.jsarraysionic-frameworkcheerio

cheerio with ionic creation of API


I am creating an ionic app. I'm using Cheerio with Node.js to scrape a site. I can't get the whole array back to localhost, it just returns the first object. How can I go about returning the entire array?

This is the scraping code (scraper.js)

const request = require('request')
const cheerio = require('cheerio');

request('https://mywebsite', (error, response, html) => {
    if (!error && response.statusCode == 200) {
        const $ = cheerio.load(html)
        const art = $('article').each((i, el) => {
            const title = $(el)
                .find('.entry-title.mh-posts-grid-title')
                .text();
            const link = $(el)
                .find('a')
                .attr('href');
            const image = $(el)
                .find('.mh-thumb-icon.mh-thumb-icon-small-mobile')
                .text()
            const Arra = { title: [title], link: [link], image: [image] }
            exports.Arra = Arra

This is the code where I export the data (document.js)

const express = require("express");
const ok = require('./ok')
const app = express();
const porta = '8000'



app.get('/', (req, res) => {
    res.send(ok.Arra);
})

app.listen(porta, () => {
    console.log(`Server ex ${porta}`);
});

Solution

  • If the code posted is the sum total of your code then the issue is likely the missing closing tags. It should be as shown below:

    const request = require('request');
    const cheerio = require('cheerio');
    
    const Arra = [];
    
    request('https://mywebsite', (error, response, html) => {
        // reset Array on each call
        Arra = [];
        if (!error && response.statusCode == 200) {
            const $ = cheerio.load(html)
            console.log('the array I am going to iterate over is', $);
            const art = $('article').each((i, el) => {
                const title = $(el)
                    .find('.entry-title.mh-posts-grid-title')
                    .text();
                const link = $(el)
                    .find('a')
                    .attr('href');
                const image = $(el)
                    .find('.mh-thumb-icon.mh-thumb-icon-small-mobile')
                    .text();
                // you must push each result into the array otherwise you are just going to have one result.
                Arra.push({ title: [title], link: [link], image: [image] });
        } // close of .each block
      }// close of if block
     }// close of request block
    exports.Arra = Arra;