Cheerio .text () возвращает неправильный ответ - PullRequest
0 голосов
/ 23 апреля 2020

Я использую cheerio в node.js, чтобы получить элементы сайта. С этим я сделаю звезды и другие вещи.

Я хотел бы взять только текст в следующем коде:

<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%

Кто-то может мне помочь? Или вы знаете другое решение для решения этой проблемы?

Спасибо тем, кто найдет время, чтобы помочь мне.

1 Ответ

0 голосов
/ 23 апреля 2020

Обновление 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(). Но не используйте это бесконечное l oop без учета всех последствий.

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())
...