将 post 变量与 querySelector 一起使用
Use post variable with querySelector
我在尝试使用 puppeteer 和 querySelector 在网络上抓取数据时遇到问题。
我有一个处理 post 查询的 nodeJS WebServer,然后调用一个函数来抓取数据。我发送了 2 个参数(postBlogUrl 和 postDomValue)。
PostDomValue 将包含我试图从中获取数据的选择器作为字符串,例如:
[itemprop='articleBody'].
如果我手动建议选择器 ([itemprop='articleBody']),一切正常,我能够检索数据,但如果我使用 postDomValue 变量,则没有返回。
我已经尝试使用 CSS.escape(postDomValue) 转义 var,但没有成功。
fetchBlogContent: async function(postBlogUrl, postDomValue) {
try {
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
page = await browser.newPage();
await page.goto(postBlogUrl, {
waitUntil: 'load'
})
let description = await page.evaluate(() => {
//This works return document.querySelector("[itemprop='articleBody']").innerHTML;
//This won't return document.querySelector(postDomValue).innerHTML;
})
return description
} catch (err) {
// handle err
return err;
}
}
如果我理解正确,问题可能是您尝试在浏览器上下文中执行的 page.evaluate()
参数函数中使用在 Node.js 上下文中声明的变量。在这种情况下,您需要将变量的值作为附加参数传递:
let description = await page.evaluate((selector) => {
return document.querySelector(selector).innerHTML;
}, postDomValue);
更多内容见page.evaluate()
。
const description = await page.evaluate((value) =>
document.querySelector(value).innerHTML, JSON.stringify(postDomValue));
请参阅 puppeteer
中有关如何将参数传递给 page.evaluate()
的文档
我在尝试使用 puppeteer 和 querySelector 在网络上抓取数据时遇到问题。
我有一个处理 post 查询的 nodeJS WebServer,然后调用一个函数来抓取数据。我发送了 2 个参数(postBlogUrl 和 postDomValue)。
PostDomValue 将包含我试图从中获取数据的选择器作为字符串,例如: [itemprop='articleBody'].
如果我手动建议选择器 ([itemprop='articleBody']),一切正常,我能够检索数据,但如果我使用 postDomValue 变量,则没有返回。
我已经尝试使用 CSS.escape(postDomValue) 转义 var,但没有成功。
fetchBlogContent: async function(postBlogUrl, postDomValue) {
try {
const puppeteer = require('puppeteer');
const browser = await puppeteer.launch();
page = await browser.newPage();
await page.goto(postBlogUrl, {
waitUntil: 'load'
})
let description = await page.evaluate(() => {
//This works return document.querySelector("[itemprop='articleBody']").innerHTML;
//This won't return document.querySelector(postDomValue).innerHTML;
})
return description
} catch (err) {
// handle err
return err;
}
}
如果我理解正确,问题可能是您尝试在浏览器上下文中执行的 page.evaluate()
参数函数中使用在 Node.js 上下文中声明的变量。在这种情况下,您需要将变量的值作为附加参数传递:
let description = await page.evaluate((selector) => {
return document.querySelector(selector).innerHTML;
}, postDomValue);
更多内容见page.evaluate()
。
const description = await page.evaluate((value) =>
document.querySelector(value).innerHTML, JSON.stringify(postDomValue));
请参阅 puppeteer
中有关如何将参数传递给page.evaluate()
的文档