从网站表中提取特定列的内容

时间:2019-10-14 22:40:34

标签: javascript puppeteer selectors-api

我正在尝试从https://www.passwordrandom.com/most-popular-passwords网站上的表格中提取所有密码。我只想在每个td中拉第二个元素,除了第一个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()

本质上,结果应该是一个包含表中每个密码的数组。密码是每个td中第二个元素(第一个tr除外)的帮助(如我上面所述)。

1 个答案:

答案 0 :(得分:1)

page.evaluate内部的代码在浏览器内部运行,外部代码在node上运行。

当您使用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。