【问题标题】:Xpath functions not working in playwrightXpath 函数在 playwright 中不起作用
【发布时间】:2023-03-21 21:46:01
【问题描述】:

当我尝试使用 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

但如果我尝试使用 xpath 函数text() 获取 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 函数。

【问题讨论】:

  • 我怀疑这是因为h1(在您的第二个示例中)已经是一个文本节点,所以它没有属性textContent。所以我会尝试只评估h1 看看会发生什么。
  • @JackFleeting 我试过了,它返回了null

标签: javascript node.js xpath web-scraping playwright


【解决方案1】:

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

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

【讨论】:

    【解决方案2】:

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

    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')
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-02-15
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多