Variable in for loop throws an undefiened error

Hi,

I recived an error “Cannot read properties of undefined (reading ‘innerText’)”. But it’s a strange, because when I changed var “i” to a constant value everything is working. And first element in “spread” array does not throw an above error. I will appreciate any help.

const puppeteer = require('puppeteer'); const fs = require('fs'); (async function () { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://www.basketball-reference.com/leagues/NBA_2024_ratings.html#ratings'); const data = await page.evaluate(function() { const table = document.getElementsByClassName("sortable stats_table now_sortable")[0] .getElementsByTagName("tbody")[0] .getElementsByTagName("tr") const spread = []; for(let i = 0; i<table.length; i++) { spread.push( { "rank": table[i].getElementsByTagName("th")[0].innerText, "name": table[i].getElementsByTagName("td")[0].innerText, "conf": table[i].getElementsByTagName("td")[1].innerText // "div" :table[i].getElementsByTagName("td")[2].innerText, // "wins": table[i].getElementsByTagName("td")[3].innerText, // "losses" :table[i].getElementsByTagName("td")[4].innerText, // "wins/loss%": table[i].getElementsByTagName("td")[5].innerText, // "mov" :table[i].getElementsByTagName("td")[6].innerText, // "oRtg": table[i].getElementsByTagName("td")[7].innerText, // "dRtg" :table[i].getElementsByTagName("td")[8].innerText, // "NRtg": table[i].getElementsByTagName("td")[9].innerText, // "mov/A" :table[i].getElementsByTagName("td")[10].innerText, // "oRtg/A": table[i].getElementsByTagName("td")[11].innerText, // "dRtg/A" :table[i].getElementsByTagName("td")[12].innerText, // "NRtg/A" :table[i].getElementsByTagName("td")[13].innerText } ) } return spread; }) fs.writeFile(`data.json`, JSON.stringify(data), (err) => { if (err) { console.log(err); } else { console.log(`Data of Page Scraped`); } }); })();

I’ve found solution to this problem. I stopped creating an object inside scraped data and instead used variables. I also added try & catch block to prevent occuring any more errors. Now my code looks like this.

const puppeteer = require('puppeteer'); const fs = require('fs'); (async function () { const browser = await puppeteer.launch(); const page = await browser.newPage(); await page.goto('https://www.basketball-reference.com/leagues/NBA_2024_ratings.html#ratings'); const data = await page.evaluate(function() { const table = document.getElementsByClassName("sortable stats_table now_sortable")[0] .getElementsByTagName("tbody")[0] .getElementsByTagName("tr") const spread = []; for(let i = 0; i<table.length; i++) { let rank, name, conf; try { rank = table[i].getElementsByTagName("th")[0].innerText, name = "empty", conf = table[i].getElementsByTagName("td")[0].innerText // "div" :table[i].getElementsByTagName("td")[2].innerText, // "wins": table[i].getElementsByTagName("td")[3].innerText, // "losses" :table[i].getElementsByTagName("td")[4].innerText, // "wins/loss%": table[i].getElementsByTagName("td")[5].innerText, // "mov" :table[i].getElementsByTagName("td")[6].innerText, // "oRtg": table[i].getElementsByTagName("td")[7].innerText, // "dRtg" :table[i].getElementsByTagName("td")[8].innerText, // "NRtg": table[i].getElementsByTagName("td")[9].innerText, // "mov/A" :table[i].getElementsByTagName("td")[10].innerText, // "oRtg/A": table[i].getElementsByTagName("td")[11].innerText, // "dRtg/A" :table[i].getElementsByTagName("td")[12].innerText, // "NRtg/A" :table[i].getElementsByTagName("td")[13].innerText } catch(e) { console.log("Error:" + e); } spread.push({rank, name, conf}); } return spread; }) fs.writeFile(`data.json`, JSON.stringify(data), (err) => { if (err) { console.log(err); } else { console.log(`Data of Page Scraped`); } }); })();