Cheerio .text() returns 错误响应
Cheerio .text() returns wrong response
我在 node.js 中使用 cheerio 获取网站元素。有了这个,我就可以做星星和其他东西了。
我只想取下面代码中的文字:
<div id="graphDD3" class="pie-chart small" style="padding: 0px; position: relative;">
42.2%
<canvas class="flot-base" style="direction: ltr; position: absolute; left: 0px; top: 0px; width: 100px; height: 100px;" width="100" height="100"></canvas>
<canvas class="flot-overlay" style="direction: ltr; position: absolute; left: 0px; top: 0px; width: 100px; height: 100px;" width="100" height="100"></canvas>
</div>
我试过下面的代码
let rate = $('#graphDD3').text().trim();
console.log(rate);
但我的控制台显示 0
而不是 42.2%
有人可以帮助我吗?或者您知道解决此问题的另一种解决方案吗?
感谢那些愿意花时间帮助我的人。
更新 2
以下 Puppeteer 代码在提取文本之前等待 3000ms
。您可以手动更新此延迟,也可以设置一个函数来监视 HTML 变化,如 .
中所述
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('http://localhost:8000',{ waitUntil: 'domcontentloaded' });
await page.waitFor(3000);
console.log(await page.$eval('#graphDD3', el => el.innerText));
await browser.close();
})();
作为旁注,可以使用以下代码片段来计时文本更改,然后使用此值为 .waitFor()
方法提供适当的延迟。 但是不要在不考虑所有后果的情况下使用这个无限循环。
var startTime = new Date()
while(true){
const val = await page.$eval('#graphDD3', el => el.innerText);
if(val != '0'){
console.log(val);
break;
}
}
console.log(new Date - startTime);
更新 1
您的代码中没有语法错误,因此问题很可能是由于 JavaScript 呈现的内容造成的。为了在这种情况下获得正确的结果,您必须使用无头浏览器(例如 puppeteer
呈现页面,然后您可以提取信息。
原答案
.text()
是一种方法,而不是 属性。所以代码应该是:
let rate = $('#graphDD3');
console.log(rate.text().trim())
我在 node.js 中使用 cheerio 获取网站元素。有了这个,我就可以做星星和其他东西了。
我只想取下面代码中的文字:
<div id="graphDD3" class="pie-chart small" style="padding: 0px; position: relative;">
42.2%
<canvas class="flot-base" style="direction: ltr; position: absolute; left: 0px; top: 0px; width: 100px; height: 100px;" width="100" height="100"></canvas>
<canvas class="flot-overlay" style="direction: ltr; position: absolute; left: 0px; top: 0px; width: 100px; height: 100px;" width="100" height="100"></canvas>
</div>
我试过下面的代码
let rate = $('#graphDD3').text().trim();
console.log(rate);
但我的控制台显示 0
而不是 42.2%
有人可以帮助我吗?或者您知道解决此问题的另一种解决方案吗?
感谢那些愿意花时间帮助我的人。
更新 2
以下 Puppeteer 代码在提取文本之前等待 3000ms
。您可以手动更新此延迟,也可以设置一个函数来监视 HTML 变化,如
const puppeteer = require('puppeteer');
(async () => {
const browser = await puppeteer.launch({ headless: true });
const page = await browser.newPage();
await page.goto('http://localhost:8000',{ waitUntil: 'domcontentloaded' });
await page.waitFor(3000);
console.log(await page.$eval('#graphDD3', el => el.innerText));
await browser.close();
})();
作为旁注,可以使用以下代码片段来计时文本更改,然后使用此值为 .waitFor()
方法提供适当的延迟。 但是不要在不考虑所有后果的情况下使用这个无限循环。
var startTime = new Date()
while(true){
const val = await page.$eval('#graphDD3', el => el.innerText);
if(val != '0'){
console.log(val);
break;
}
}
console.log(new Date - startTime);
更新 1
您的代码中没有语法错误,因此问题很可能是由于 JavaScript 呈现的内容造成的。为了在这种情况下获得正确的结果,您必须使用无头浏览器(例如 puppeteer
呈现页面,然后您可以提取信息。
原答案
.text()
是一种方法,而不是 属性。所以代码应该是:
let rate = $('#graphDD3');
console.log(rate.text().trim())