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
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:gives you an array of the text, but you want an array of
{ tool: <text> }
, so:(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:
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()})