gpt4 book ai didi

javascript - cheerio each() 函数行为异常

转载 作者:行者123 更新时间:2023-11-30 06:21:16 28 4
gpt4 key购买 nike

我有一个代码,可以对特定页面进行网络废弃。我使用 puppeteer+cheerio 来做到这一点。在我的笔记本电脑上代码完美运行。但是在将它部署到 VDS 之后,cheerio each() 选择器开始奇怪地工作。 (但它在我的笔记本电脑上仍然可以正常工作)。问题是在 VDS 上发生以下错误:

(node:28544) UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'trim' of undefined at Node. (/home/ubuntu/handbot/liveMonitoring.js:211:82) at initialize.exports.each (/home/ubuntu/handbot/node_modules/cheerio/lib/api/traversing.js:300:24) at Node. (/home/ubuntu/handbot/liveMonitoring.js:182:29) at initialize.exports.each (/home/ubuntu/handbot/node_modules/cheerio/lib/api/traversing.js:300:24) at liveMonitoring (/home/ubuntu/handbot/liveMonitoring.js:175:28) at process._tickCallback (internal/process/next_tick.js:68:7) (node:28544) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1) (node:28544) [DEP0018] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.

最有趣的一点是有时错误会消失(似乎没有发生错误的模式)。我试图通过重新安装 node js 来解决这个问题,但它没有用。问题不在我的代码中(因为它可以在我的笔记本电脑上运行,有时甚至可以在 vds 上运行)。我认为导出 each() 函数有些问题。由于错误消息,

中发生了一些错误

/home/ubuntu/handbot/node_modules/cheerio/lib/api/traversing.js:300:24

traversing.js的代码(298-302行):

`

exports.each = function(fn) {
var i = 0, len = this.length;
while (i < len && fn.call(this[i], i,
this[i]) !== false) ++i;
return this;
};

导致错误的代码:

const page = await browser.newPage();
await page.goto(url, {timeout:0}).catch((err)=> { console.log(err)});

await page.setRequestInterception(true);

page.on('request', req => {

if(['image', 'stylesheet', 'font'].indexOf(req.resourceType()) !== -1)
req.abort();
else
req.continue();

});

let content = await page.content();
let $ = cheerio.load(content);



let gameContent=$('#games_content').children('div').children('div');



gameContent.children().each(function(i, elem1){

let league=$(elem1).children('.greenBack').children('.c-events__name').children('a').text().trim();

$(this).children().each(function(j, elem2){

if(j!==0) {

let currentInfo = {};
currentInfo['league'] = league;

let shortCut = $(elem2).children('.c-events__item_game').children('.c-events-scoreboard').children();
let mainInfo = shortCut.first();

currentInfo['link'] = mainInfo.children("a").attr("href");
let teams = mainInfo.children("a").children("span").attr("title").trim().split("—");
currentInfo['team1'] = teams[0].trim();
currentInfo['team2'] = teams[1].trim();

let shortCutForTotal = $(elem2).children('.c-events__item_game').children('.c-bets');

}
});
});

提前致谢!`

最佳答案

通过更改这些代码行解决了问题:

page.on('request', req => {

if(['image', 'stylesheet', 'font'].indexOf(req.resourceType()) !== -1)
req.abort();
else
req.continue();

})

有以下几个:

page.on('request', interceptedRequest => {

if (interceptedRequest.url().endsWith('.png') || interceptedRequest.url().endsWith('.jpg') || interceptedRequest.url().endsWith('.css'))

interceptedRequest.abort();
else

interceptedRequest.continue();
});

并在上面的代码行之后放置 await page.goto(url);

然后添加一个选项 waitUntil:'networkidle0'page.goto(url)

关于javascript - cheerio each() 函数行为异常,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52910440/

28 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com