我正在使用Chrome Puppeteer来获取网页上的某些内容。此内容是伪表中的项列表。我正在使用XPath来获取此内容。
当我测试Xpath表达式[在Chrome中使用XPath Helper Extension]时,它会显示文本列表,所以我知道XPath表达式没问题。
然而,我在尝试用Puppeteer做这件事时遇到了问题。下面是相关代码[我省略了打开和关闭木偶操作码]:
var xpath_expr_str = "//div[contains(@class,'listings')]/div[4]/p/a";
var page_url_str = 'https://my-url';
await page.goto(page_url_str);
await page.waitForXPath(xpath_expr_str);
var xpath_payload_arr = await page.$x(xpath_expr_str);
var xpath_val_arr = await page.evaluate(function(payload_arr){
var url_list_arr = [];
for(var i = 0; i < payload_arr.length; i++)
{
url_list_arr.push(payload_arr[i].textContent);
}
return url_list_arr;
}, xpath_payload_arr);
console.log(xpath_val_arr);
当我运行它时,我收到以下错误:
UnhandledPromiseRejectionWarning: TypeError: Converting circular structure to JSON
我似乎无法进入名单。但是,问题是如果我尝试只获得列表中的单个项目,它就可以了。例如,以下代码有效:
var xpath_val_str = await page.evaluate(function(payload_arr){
return payload_arr.textContent;
}, xpath_payload_arr[0]);
console.log(xpath_val_str);
使用Puppeteer时管理XPath列表的正确方法是什么?
答案 0 :(得分:4)
很遗憾,您无法将xpath_payload_arr
传递给page.evaluate
,因为它是一个复杂的对象,显然包含对自身的引用。 More on "Converting circular structure to JSON" error
但是我们可以在节点上下文和page.evaluate
项目中逐个迭代它:
var xpath_expr_str = '//*[@id="questions"]/div/div/h3/a';
var page_url_str = 'https://stackoverflow.com/questions/tagged/puppeteer';
await page.goto(page_url_str);
await page.waitForXPath(xpath_expr_str);
var xpath_payload_arr = await page.$x(xpath_expr_str);
var url_list_arr = [];
for(var i = 0; i < xpath_payload_arr.length; i++)
{
url_list_arr.push(await page.evaluate(el => el.textContent, xpath_payload_arr[i]));
}
console.log(url_list_arr);
这会产生预期的结果: