1

当我尝试使用 xpath 函数时,Playwright 没有按预期工作。

这是我为抓取https://example.org<h1>标签内的文本而编写的代码。

const pw = require('playwright');

async function fetch(url) {
    var browser = await pw.chromium.launch();
    var context = await browser.newContext();
    var page = await context.newPage();
    await page.goto(url);
    const h1 = await page.$('//h1')
    console.log(await h1.evaluate(h1 => h1.innerHTML, h1));
    await browser.close();
}

fetch('https://example.com')

执行时,此代码可以完美运行并显示,

Example Domain

但是,如果我尝试使用text()下面的 xpath 函数获取 h1 标记内的文本,

const h1 = await page.$('//h1/text()'); // also tried await page.$('xpath=//h1/text()');
console.log(await h1.evaluate(h1 => h1.textContent, h1));

它在投掷,

UnhandledPromiseRejectionWarning: TypeError: Cannot read property 'evaluate' of null

我做错了什么还是不能与 xpath 函数一起使用。

4

2 回答 2

3

正如 Michael 所说,该$函数的目的是返回一个 DOM 元素。如果要计算 XPath 表达式,可以document.evaluateevaluate函数中使用。

async function fetch(url) {
    var browser = await playwright.chromium.launch();
    var context = await browser.newContext();
    var page = await context.newPage();
    await page.goto(url);
    console.log(await page.evaluate(() => 
        document.evaluate('//h1/text()', document, null, XPathResult.STRING_TYPE).stringValue));
    await browser.close();
}

fetch('https://example.com')
于 2020-01-27T00:35:57.383 回答
1

首先,text()它实际上不是一个函数。child::text()它是选择包含元素的文本节点的轴步骤的缩写。

XPath 表达式运行良好;这是错误的调用应用程序代码。如果您的 XPath 表达式返回文本节点,则应用程序无法访问textContent,因为文本节点没有textContent属性。那是给你的DOM......

于 2020-01-26T18:59:59.483 回答