【发布时间】:2018-06-26 01:33:01
【问题描述】:
我是 puppeteer 的新手(一般来说 JavaScript 不太好),我正在尝试编写一些基本功能:
- 从 XPath 中获取所有链接
- 循环并点击这些链接
- 截屏并保存页面的 HTML
- 返回,截图并保存记录页面的HTML,保存在其他人的同一目录中,然后重新开始处理
我得到的错误是:
评估失败:DOMException:无法在“文档”上执行“querySelector”:“0”不是有效的选择器
这是我的代码:
我相当有信心所有代码都能正常工作,除了我在使用 XPath 获得正确的东西时遇到的问题。我得到这些的网站是:
代码:
const records = await page.$x('//table[2]//tr[td[a]]//td[1]/a');
let int = 0;
for (let record in records) {
await Promise.all([
page.waitForNavigation(),
page.click(record)
]);
await Promise.all([makeDirectory('screenshots/item'+int), makeDirectory('screenshots/item'+int+'/base'), makeDirectory('screenshots/item'+int+'/record')]);
let recordPath = "screenshots/item"+int+"/record/record.html";
let basePath = "screenshots/item"+int+"/base/base.html";
page.screenshot({path: "screenshots/item"+int+"/record/record.png", fullPage: true});
let recordBody = await page.evaluate(() => document.body.innerHTML);
await saveHtml(recordPath, recordBody);
await Promise.all([
page.waitForNavigation(),
page.goBack()
]);
await page.screenshot({path: "screenshots/item"+int+"/base/base.png", fullPage: true});
let baseBody = await page.evaluate(() => document.body.innerHTML);
await saveHtml(basePath, baseBody);
int++;
console.log(record);
}
async function makeDirectory(path) {
mkdirp(path, function(err) {
if (err) throw err;
});
};
async function saveHtml(path, html) {
await fs.writeFile(path, html, (err) => {
if (err) throw err;
});
};
注意:我必须使用 XPath :(
2018 年 6 月 25 日更新 这现在给了我来自 xpath 选择器的所有链接。然后我对其进行迭代并仅使用 page.goto 转到正确的站点。
const linksXPath = '//table[2]//tr[td[a]]//td[1]/a';
const links = await page.evaluate((selector) => {
let results = [];
let query = document.evaluate(selector,
document,
null, XPathResult.ORDERED_NODE_SNAPSHOT_TYPE, null);
for (let i=0, length=query.snapshotLength; i<length; ++i) {
results.push(query.snapshotItem(i).href);
}
return results;
}, linksXPath);
【问题讨论】:
-
请将您的代码作为文本而不是图像插入问题中,这样可以测试您的代码。
-
@Vaviloff 谢谢,给你。
-
您是否使用 xpath 解决了这个问题?