page.evaluate возвращает нулевые значения, но консоль браузера возвращает правильные значения - PullRequest
1 голос
/ 04 мая 2019

Я использую Puppeteer для веб-приложений.Функция Page.evaluate возвращает нулевые значения.Но та же функция в консоли браузера возвращает правильные значения.

const puppeteer = require('puppeteer');
let scrape = async () => {
  const browser = await puppeteer.launch({headless:false});
  const page = await browser.newPage();
  var ticker = 'DIS';
  var my_url = 'https://seekingalpha.com/symbol/'  + ticker + '/momentum/moving-averages'; 
  await page.setUserAgent('Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:66.0) Gecko/20100101 Firefox/66.0');
  await page.goto(my_url);


  page.on('console', msg => console.log('PAGE LOG:', msg.text()));
  const result = await page.evaluate(() => {
    const elements = Array.from(document.querySelectorAll('table tr td'));
    let links = elements.map(element => {
        return element.href
    })
    console.log(links, 'inside page.evaluate');
    return links;
  });
    browser.close();
    return result;
};  


scrape().then((value) => {
  console.log(value); // Success!

Получение следующих результатов ....

PAGE LOG: JSHandle@array inside page.evaluate
[ null, null, null, null, null, null, null, null, null, null ]

в консоли браузера, я получаю ....

document.querySelectorAll('table tr td')
NodeList(10) [ td.left.left-text, td.middle.center-text, td.middle.center-text, td.middle.center-text, td.right.center-text, td.left.left-text, td.middle.center-text.red, td.middle.center-text.green, td.middle.center-text.green, td.right.center-text.green ]

Буду признателен за любую помощь...

С предложением Томаса я смог внести следующие коррективы, и теперь он работает ...

sma[0] = await page.$eval('table tr:nth-child(2) td:nth-child(2)', el => {return el.innerHTML });
  sma[1] = await page.$eval('table tr:nth-child(2) td:nth-child(3)', el => {return el.innerHTML });
  sma[2] = await page.$eval('table tr:nth-child(2) td:nth-child(4)', el => {return el.innerHTML });
  sma[3] = await page.$eval('table tr:nth-child(2) td:nth-child(5)', el => {return el.innerHTML });

1 Ответ

0 голосов
/ 04 мая 2019

Ваш console.log(links, 'inside page.evaluate') выполняется во время выполнения браузера. Любые данные, зарегистрированные или отправленные из браузера в среду Node.js, должны быть сериализуемыми (см. docs ), что не относится к элементам DOM. Поэтому вместо него отображается null.

Для запроса элементов вы можете использовать функцию page. $$ (селектор) . Пример:

const tds = await page.$$('table tr td');

Хотя код внутри браузера работает нормально. Я думаю, что ваша настоящая проблема в том, что ваш код запрашивает элементы td, а затем пытается сопоставить элементы td с их значением href. Вы, вероятно, хотите перебрать элементы a вместо этого, я предполагаю. Так что, вероятно, ваш селектор должен быть 'table tr td a'.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...