我正在尝试从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除外)的帮助(如我上面所述)。
答案 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。