从网站中提取特定栏目的内容 table
Pulling specific column's content from website table
我正在尝试从网站 https://www.passwordrandom.com/most-popular-passwords 的 table 提取所有密码。我只是想拉出每个 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()
本质上,结果应该是一个数组,其中包含 table 中的每个密码。密码在每个 td 的第二个元素中都有帮助,除了第一个 tr(就像我上面说的)。
page.evaluate里面的代码运行在浏览器里面,外面的代码运行在node上。
当您 return 使用 document.querySelectorAll 的元素时,它 return 是一个 NodeList,然后对其进行序列化,并且由于序列化而导致数据丢失(或引用不同)。这意味着,allNodes[row].textContent
将不起作用。
最简单的方法是return里面的数据从page.evaluate.
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。
我正在尝试从网站 https://www.passwordrandom.com/most-popular-passwords 的 table 提取所有密码。我只是想拉出每个 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()
本质上,结果应该是一个数组,其中包含 table 中的每个密码。密码在每个 td 的第二个元素中都有帮助,除了第一个 tr(就像我上面说的)。
page.evaluate里面的代码运行在浏览器里面,外面的代码运行在node上。
当您 return 使用 document.querySelectorAll 的元素时,它 return 是一个 NodeList,然后对其进行序列化,并且由于序列化而导致数据丢失(或引用不同)。这意味着,allNodes[row].textContent
将不起作用。
最简单的方法是return里面的数据从page.evaluate.
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。