首页 > 解决方案 > console.log 消息被截断

问题描述

我是木偶新手。我曾经拥有 PhantomJS 和 CasperJS,但是在设置更新的服务器(freebsd 12)时发现对 PhantomJS 的支持已经消失,并且 CasperJS 给了我分段错误。

我能够很好地将我的应用程序移植到 puppeteer,但遇到了一个问题,即当我想从表中捕获数据时,这些数据似乎不完整或被截断。

我需要一张桌子上的所有信息,但总是得到更少。

我尝试过较小的表,但它也被截断了。我不知道console.log缓冲区是否可以扩展,或者是否有更好的方法来获取表中所有 tds 的值。

const data = await page.$$eval('table.dtaTbl tr td', tds => tds.map((td) => {
    return td.innerHTML;
}));

console.log(data); 

我应该能够得到所有行,但我得到了这个

[ 'SF xx/xxxx 3-3999 06-01-16',
'Sample text - POLE',
  '',

 /* tons of other rows (removed by me in this example) <- */

  '',

 /* end of output */ ... 86 more items ]

我需要其他 86 件物品!!!因为我在执行代码时让 PHP 从标准输出中获取它。

标签: javascriptnode.jsgoogle-chromepuppeteer

解决方案


为什么console.log不起作用

在后台,console.log使用util.inspect,它产生用于调试的输出。为了创建合理的调试信息,此函数将截断过长的输出。引用文档:

util.inspect() 方法返回用于调试的对象的字符串表示形式。util.inspect 的输出可能随时更改,不应以编程方式依赖


解决方案:使用process.stdout

如果您想向其中写入输出,stdout可以使用process.stdout可写流。它不会修改/截断您在流上写入的内容。你可以像这样使用它:

process.stdout.write(JSON.stringify(data) + '\n');

我在末尾添加了换行符,因为该函数本身不会产生换行符(与 相比console.log)。如果您的脚本不依赖它,您可以简单地删除它。


推荐阅读