我今天开始学习木偶戏,但遇到了一个问题。我试图创建一个 covid 跟踪器,我想从世界测量仪中抓取。但是当我尝试取回信息时,它返回一个包含空对象的数组。对象数量与具有相同类别的标签数量匹配,但不显示任何信息。这是我的代码
const puppeteer = require("puppeteer")
async function getCovidCases(){
const browser = await puppeteer.launch({
defaultViewport: null,
headless: false,
slowMo: 250
})
const page = await browser.newPage()
const url = "https://www.worldometers.info/coronavirus/#countries"
await page.goto(url, {waitUntil: 'networkidle0'})
await page.waitForSelector(".navbar-nav", {visible: true})
const results = await page.$$eval(".navbar-nav", rows => {
return rows
})
await console.log(results)
}
getCovidCases()
有人知道该怎么做吗?
答案 0 :(得分:0)
基于选择器,我假设您在此步骤中对导航栏项目感兴趣。
const results = await page.$$eval(".navbar-nav", navBars => {
return navBars.map(navBar => {
const anchors = Array.from(navBar.getElementsByTagName('a'));
return anchors.map(anchor => anchor.innerText);
});
})
这会产生 [ [ 'Coronavirus', 'Population' ] ]
并且可能对您有用。
如果您只需要一个元素,请使用 $eval
,如果您需要多个元素,请使用 $$eval
。在回调中,您有对该 dom 元素的引用,但不能直接返回它。如果您 console.log
任何内容,它都不会显示在 nodejs 终端中,而是显示在浏览器终端中。您返回的内容将发送回 nodejs 并且它需要可序列化(我认为)。您从 navBar
返回的内容将转换为空对象,而不是您想要的。这就是我映射它并将其转换为字符串 (innerText
) 的原因。
如果您想抓取其他数据,您应该使用另一个选择器 (.nav-bar
)。