const puppeteer = require("puppeteer");
(async function main() {
try {
const browser = await puppeteer.launch({headless: false});
const page = await browser.newPage();
page.setUserAgent("Mozilla/5.0 (Windows NT 6.1; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/72.0.3626.121 Safari/537.36");
await page.goto("https://www.qimai.cn/rank/index/brand/all/genre/6014/device/iphone/country/us/date/2019-03-19", {waitUntil: 'load', timeout: 0});
await page.waitForSelector(".container");
const sections = await page.$$(".container");
const freeButton = await page.$('[href="/rank/index/brand/free/device/iphone/country/us/genre/6014/date/2019-03-19"]');
await freeButton.click();
// free list
const appTable = await page.waitForSelector(".data-table");
const lis = await page.$$(".data-table > tbody > tr > td");
// go to app content
const appInfo = await page.$("a.icon");
// appInfo.click();
for (const content of lis) {
const name = await content.$("div.appname");
const gameName = await page.evaluate(name => name.innerText, name);
console.log("Game Name: ", gameName);
}
console.log("-- bingo --");
} catch (e) {
console.log("our error", e);
}
})();
我似乎无法从<div class="appname">
获得文本,并且我收到以下错误:
TypeError:无法读取null的属性“innerHTML”。
我试过所有的方法,但都不起作用。
这是网站的链接:https://www.qimai.cn/app/rank/appid/1451505313/country/us .
8条答案
按热度按时间ne5o7dgx1#
我使用“waitForSelector”方法,然后尝试获取文本
a0zr77ik2#
使用
waitForSelector
和evaluate
,这将变得非常干净kb5ga3dv3#
我使用Puppeteer和jest从DOM选择中检索值的最简单方法是使用eval方法。
假设我需要一个范围中的文本值。
官方文件链接:https://pptr.dev/#?product=Puppeteer&version=main&show=api-pageevalselector-pagefunction-args
toe950274#
如果通过XPath获取元素,只需使用上面的代码。
这将打印消息“随机文本”。
zf9nrax15#
如果您的目标是接收文本,您可以在DOM页面中使用JS。
更改此内容:
对此:
B:由于没有示例,此代码还没有在实际的html页面上进行测试。
但是,您应该了解如何使用DOM原生方法重新实现操纵 puppet 的逻辑,以实现目标。
yk9xbfzb6#
来自文档:
2ul0zpep7#
yb3bgrhw8#
在前端框架如Angular中,通过直接调用来改变DOM是不可取的,因为这些框架需要对DOM进行完全控制才能正常工作。然而,直接操作DOM可能会导致不必要的错误或行为。
**长话短说,**不要用途:
await element.evaluate(el => el.textContent);
用于Angular和类似的前端框架/库。