skip to Main Content

I’m using "Web scraper apify" to scrap some data from a website. The goal is to get all the texts in H2 and return an array of them. My problem is when I returned the array. This one is not correct and not usable because it separates all the letters of the different scrapped texts.

I tried to write this code (javascript and jquery including):

function pageFunction() {
  const results = []

  $('h2').map(function() {
    results.push($(this).text());
  });

  return results;
}

console.log(pageFunction());
<h2>Heading One</h2>
<h2>Heading Two</h2>
<h2>Heading Three</h2>

<script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>

And I have this result when I export in JSON

[{
  "0": "M",
  "1": "u",
  "2": "t",
  "3": "i",
  "4": "n",
  "5": "y"
},
{
  "0": "G",
  "1": "r",
  "2": "o",
  "3": "w",
  "4": "S",
  "5": "u",
  "6": "m",
  "7": "o"
},
{
  "0": "C",
  "1": "u",
  "2": "s",
  "3": "t",
  "4": "o",
  "5": "m",
  "6": "e",
  "7": "r",
  "8": ".",
  "9": "i",
  "10": "o"
}]

I would like something like


[{
"tool": "Mutiny"
},
{
"tool": "Growsumo"
},
{
"tool":"customer.io"
}]

2

Answers


  1. Regardless of the cause of the string being split to a character array, to get the desired output, change the map so that it returns the object that you want, rather than just the text:

    .map((i, e) => $(e).text())
    

    gives you an array of the text, but you want an array of { tool: <text> }, so:

    .map((i, e) => { return { tool : $(e).text() } })
    

    (note: jquery .map() requires .get() at the end to convert to a "true" array)

    You’ll then have an array of objects, which you can json stringify to get your desired JSON output:

    let results = $('h2').map((i, e) => { 
        return { tool: $(e).text() }
    }).get();
    
    //console.log(results);
    
    let json = JSON.stringify(results)
    
    console.log(json);
    <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"></script>
    
    <h2>Mutiny</h2>
    <h2>Growsumo</h2>
    <h2>Customer.io</h2>
    Login or Signup to reply.
  2. Results saved to Storage by Apify.pushData(returnedObject) and if your data object is array then SDK will save it as multiple items, therefore array item must be JSON, you must .push({tool: $(this).text()})

    Login or Signup to reply.
Please signup or login to give your own answer.
Back To Top
Search