console.log 消息被截断

Joh*_*ton 5 javascript google-chrome node.js puppeteer

我是木偶戏的新手。我曾经有 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); 
Run Code Online (Sandbox Code Playgroud)

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

[ '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 ]
Run Code Online (Sandbox Code Playgroud)

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

Tho*_*orf 14

为什么console.log不起作用

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

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


解决方法:使用 process.stdout

如果要将输出写入,stdout可以使用process.stdoutwhich 是可写流。它不会修改/截断您在流上写的内容。你可以这样使用它:

process.stdout.write(JSON.stringify(data) + '\n');
Run Code Online (Sandbox Code Playgroud)

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

  • 如果您想在控制数据截断方式的同时保留 console.log() 提供的颜色,可以使用 process.stdout.write(util.inspect(mydata, {colors: true, height: 5, maxArrayLength : 20}))` (5认同)
  • @ThomasDondorf @JohnRalston FWIW,这个 `console.log()` 行为涉及直接对象输出,不应截断字符串,因此 `console.log((JSON.stringify(data))` 就足够了。 (2认同)

小智 11

您还可以使用

console.log(JSON.stringify(data, null, 4)); 
Run Code Online (Sandbox Code Playgroud)

代替

process.stdout.write(JSON.stringify(data) + '\n');
Run Code Online (Sandbox Code Playgroud)