Селектор $ x в Puppeteer не работает как ElementHandle на странице. - PullRequest
0 голосов
/ 12 июня 2018

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

В документации говорится, что как $x, так и метод $ должны возвращать ElementHandle с$x метод, возвращающий массив.

$ Документы
$ x Документы

Если я запускаю два моих тестовых запроса в ChromeКонсоль на рассматриваемой странице, я получаю идентичные результаты.Если я запрашиваю оба селектора, не пытаясь оценить результат в кукловоде, я также получаю идентичные результаты.

enter image description here

Проблема возникает, когда я пытаюсь использоватьevaluate метод, ElementHandle из селектора $ x, кажется, не правильно.Но мне трудно понять, что я делаю неправильно.

Вот пример кода.Я удалил асинхронные методы в их .then.catch, чтобы помочь локализовать проблему.

const puppeteer = require('puppeteer');

(async() => {

    const searchUrl = "https://en.wikipedia.org/wiki/German_national_football_team"
    const browser = await puppeteer.launch();
    const page = await browser.newPage();

    await page.goto(searchUrl);

    const xPathSelector = page.evaluate(
            el => el.outerHTML,
            await page.$x("//table[@class='infobox']//th[contains(.,'Head')]/following-sibling::td/a")[0])
        .then(
            result => console.log(result)
        ).catch( e => {
            console.log('XPath Error', e)
        })

    const normSelector = await page.evaluate(
            el => el.outerHTML,
            await page.$("#mw-content-text > div > table:nth-child(2) > tbody > tr:nth-child(5) > td > a"))
        .then(
            result => console.log(result)
        ).catch( e => {
            console.log('XPath Error', e)
        })

    await browser.close()

})()

1 Ответ

0 голосов
/ 12 июня 2018

В первом примере вы пытаетесь прочитать первый элемент неразрешенного обещания, а не его результат, поэтому измените:

await page.$x("//table[@class='infobox']//th[contains(.,'Head')]/following-sibling::td/a")[0]

на (посмотрите на дополнительные скобки):

(await page.$x("//table[@class='infobox']//th[contains(.,'Head')]/following-sibling::td/a"))[0]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...