给定一个艰巨的Puppeteer任务,我必须在带有上下文节点的Puppeteer中评估XPath。所以我不能使用page.$x
。
我知道可以通过Javascript函数document.evaluate(xpathExpression, contextNode, namespaceResolver, resultType, result)
实现,所以我尝试了以下代码:
const puppeteer = require('puppeteer');
async function f(page, xpath) {
try {
return page.evaluate((xpath) => {
return document.evaluate(xpath, document, null, XPathResult.ANY_TYPE, null)
}, xpath)
} catch (e) {
console.log(e)
}
}
(async () => {
const browser = await puppeteer.launch();
const page = await browser.newPage();
await page.goto('http://personalitycore.com/a.html');
let p = await f(page, '//p')
console.log(p)
await browser.close();
})();
还有http://personalitycore.com/a.html
:
<head>
</head>
<body>
<p>
text_node1
<span>span_node1</span>
text_node2
<span>span_node2</span>
</p>
</body>
运行我的代码:
/usr/local/bin/node /Users/xxxx/example.js
{}
它只是返回一个空对象。
但是该脚本在Chrome中效果很好:
任何人都可以给我一些有关使用document.evaluate
在Puppeteer中评估XPath的提示吗?
答案 0 :(得分:1)
不幸的是,page.evaluate()
只能传输可序列化的值(粗糙地,JSON可以处理的值)。当document.evaluate()
返回一个不可序列化的DOM元素(它包含方法和循环引用)时,它将被一个空对象替换。您需要返回可序列化的值(例如,属性或文本内容)或使用类似page.evaluateHandle()
和ElementHandle
API的东西。