Получить атрибут href в pupeteer Node.js - PullRequest
4 голосов
/ 28 марта 2019

Мне известны такие распространенные методы, как evaluate для захвата элементов в puppeteer, но мне любопытно, почему я не могу получить атрибут href в JavaScript-подобном подходе как

const page = await browser.newPage();

await page.goto('https://www.example.com');

let links = await page.$$('a');
for (let i = 0; i < links.length; i++) {
  console.log(links[i].getAttribute('href'));
  console.log(links[i].href);
}

Ответы [ 2 ]

4 голосов
/ 28 марта 2019

await page.$$('a') возвращает массив с ElementHandles - это объекты с их собственным API, специфичным для pupeteer, у них нет обычного DOM API для элементов HTML или узлов DOM. Поэтому вам нужно либо получить атрибуты / свойства в контексте браузера через page.evaluate(), либо использовать довольно сложный API ElementHandles. Это пример с двумя способами:

'use strict';

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch();
    const [page] = await browser.pages();

    await page.goto('https://example.org/');

    // way 1
    const hrefs1 = await page.evaluate(
      () => Array.from(
        document.querySelectorAll('a[href]'),
        a => a.getAttribute('href')
      )
    );

    // way 2
    const elementHandles = await page.$$('a');
    const propertyJsHandles = await Promise.all(
      elementHandles.map(handle => handle.getProperty('href'))
    );
    const hrefs2 = await Promise.all(
      propertyJsHandles.map(handle => handle.jsonValue())
    );

    console.log(hrefs1, hrefs2);

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();
3 голосов
/ 28 марта 2019

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

async function getHrefs(page, selector) {
  return await page.$$eval(selector, anchors => [].map.call(anchors, a => a.href));
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...