Node.js网络爬虫中嵌套复杂JS对象转换为合法JSON的实现方法
爬虫表格数据生成合法JSON的解决方案
问题说明
你看到控制台输出[Object]不是数据结构错误,是JS运行环境的控制台默认会折叠2层以上深度的嵌套对象,仅做显示优化用,实际内存中的数据结构是完整的。
修正优化点
- 删除冗余操作:代码中反复执行
JSON.stringify+JSON.parse属于无效操作,构造完成的JS对象可以直接推入数组,不需要额外序列化反序列化 - 匹配字段类型:目标JSON中
table字段为字符串类型,将循环变量i转为字符串即可匹配格式要求 - 正确输出JSON:对最终组装完成的数组直接执行
JSON.stringify,指定缩进参数即可得到格式化的合法JSON
修改后可直接运行的代码
var submitButton = driver.findElement(By.className('btn btn-primary')); submitButton.click().then(function () { setTimeout(async function () { const pagesource = await driver.getPageSource(); const $ = cheerio.load(pagesource); const tableCount = $('.table , .table-bordered').length; const tablesJsonArray = []; for (let i = 0; i < tableCount; i++) { const subjectsJsonArray = []; const tableData = $('.table , .table-bordered').eq(i); const subjectCount = tableData.children('tbody').children('tr').length; for (let j = 0; j < subjectCount; j++) { const subjectData = tableData.children('tbody').children('tr').eq(j); const subjectName = subjectData.children('td').eq(0).text(); const year = subjectData.children('td').eq(1).text(); const credits = subjectData.children('td').eq(2).text(); const sOrder = subjectData.children('td').eq(3).text(); const result = subjectData.children('td').eq(4).text(); const onlineAssignmentResult = subjectData.children('td').eq(5).text(); subjectsJsonArray.push({ subject_name: subjectName.trim(), year: year, credits: credits, s_order: sOrder, result: result, online_assignment_result: onlineAssignmentResult.trim(), }); } tablesJsonArray.push({ table: i.toString(), data: subjectsJsonArray }); } // 输出格式化的合法JSON字符串,可直接写入文件或用于接口传输 const finalLegalJson = JSON.stringify(tablesJsonArray, null, 4); console.log(finalLegalJson); }, 3000); });
补充说明
如果你需要在控制台查看完整展开的对象结构做调试,可以替换打印逻辑为console.dir(tablesJsonArray, {depth: null}),即可解除深度限制展开所有层级的对象。
内容的提问来源于stack exchange,提问作者Hashan
相关产品推荐
相关产品推荐

