Извлечение содержимого определенного столбца из таблицы веб-сайта - PullRequest
0 голосов
/ 15 октября 2019

Я пытаюсь вытащить все пароли из таблицы на веб-сайте. https://www.passwordrandom.com/most-popular-passwords. Я только пытаюсь вытащить второй элемент в каждом тд, за исключением первого tr. Когда я запускаю код, все в массиве оказывается нулевым.

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

const puppeteer = require('puppeteer')
const fs = require('fs')

const baseURL = 'https://www.passwordrandom.com/most-popular-passwords'

async function scrape() {
    const browser = await puppeteer.launch()

    const page = await browser.newPage()
    console.log('Puppeteer Initialized')

    await page.goto(baseURL)

    const allNodes = await page.evaluate(() => {
        return document.querySelectorAll("#cntContent_lstMain tr:not(:first-child) td:nth-child(2)")
    })

    const allWords = []

    for (let row in allNodes)
        allWords.push(allNodes[row].textContent)

    console.log(allWords)

    await browser.close();
}

scrape()

По сути, результатом должен быть массив, содержащий каждый пароль в таблице. Пароли помогают во втором элементе каждого тд, за исключением первого тр (как я уже говорил выше).

1 Ответ

1 голос
/ 15 октября 2019

Код внутри page.evaluate запускается внутри браузера, код снаружи выполняется на узле.

Когда вы возвращаете элементы с помощью document.querySelectorAll, он возвращает NodeList, который затем сериализуется, и данные теряются (или ссылаются по-другому) из-за сериализации. Это означает, что allNodes[row].textContent не будет работать.

Самый простой способ - вернуть данные изнутри страницы. Оценить.

const allNodes = await page.evaluate(() => {
  const elements = [...document.querySelectorAll("#cntContent_lstMain tr:not(:first-child) td:nth-child(2)")]
  return elements.map(element=>element.textContent)
})

Это даст вам textContent для всехдоступные элементы с этим селектором.

...