Here is one which parses merged rows successfully.
--
Merged rows example:

-- parse
function tableToJson (table) {
        let data = [];
        // first row needs to be headers
        let headers = [];
        for (let i = 0; i < table.rows[0].cells.length; i++) {
            headers[i] = table.rows[0].cells[i].innerHTML.toLowerCase()
            headers[i] = headers[i]
                .replace(new RegExp('<b>', 'gi'), '')
                .replace(new RegExp('</b>', 'gi'), '')
                .replace(new RegExp('\r?\n', 'gi'), '')
                .trim();
        }
        // go through cells
        for (let i = 1; i < table.rows.length; i++) {
            let tableRow = table.rows[i];
            let rowData = {};
            let rowSpanValue = ''
            if (table.rows[i - 1] && table.rows[i - 1].cells[0].getAttribute("rowspan"))
                rowSpanValue = table.rows[i - 1].cells[0].innerText
            if (!!rowSpanValue)
                rowData[headers[0]] = rowData[headers[0]] || rowSpanValue
            for (let j = 0; j < tableRow.cells.length; j++) {
                let header = !!rowSpanValue ? headers[j + 1] : headers[j]
                let data = tableRow.cells[j]
                let result;
                if (data.querySelector('a')) {
                    result = tableRow.cells[j].querySelector('a').innerText;
                } else {
                    result = tableRow.cells[j].innerText;
                }
                rowData[header] = (rowData[header] || result).replace(new RegExp('\r?\n', 'gi'), '').trim();
            }
            data.push(rowData);
        }
        return data;
    }