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;
}