Node.js使用crawler库时cheerio生成HTML比res.body大且重复如何解决
问题原因
- 核心错误出在
let content_test1 = $("*").toString();这行代码:$("*")是通配符选择器,会匹配页面里所有层级的DOM节点(从顶层的html、head、body,到每一层的div、span、文本标签等所有元素),返回的是包含所有匹配元素的集合- 直接对这个元素集合调用
toString()时,会遍历每一个元素,把每个元素自身+所有后代节点的完整HTML依次拼接,相当于外层节点的内容已经被输出过一次,内层节点又会重复输出一次,最终结果自然会出现大量重复内容,体积也远大于原始的res.body
- 还有两个隐藏的代码问题:
- 错误捕获分支里抛出的变量是
err,但入参定义的错误变量是error,变量名不匹配,触发错误时会抛出变量未定义的异常 - 两次
fs.writeFile都写入同一个path路径,后执行的写入操作会直接覆盖前一次的写入结果
- 错误捕获分支里抛出的变量是
修复方案
如果要获取cheerio解析处理后的完整页面HTML,把获取content_test1的代码替换为let content_test1 = $.html();即可,这个方法会输出和原始res.body结构一致的完整HTML内容,不会出现重复。
内容的提问来源于stack exchange,提问作者delepelaire charles
相关产品推荐
相关产品推荐

