当前位置: 首页 > 知识库问答 >
问题:

如何在chrome Headless+Puppeteer evaluate()中使用xpath?

许毅
2023-03-14

脚本超时。

共有1个答案

柳俊健
2023-03-14

$x()不是通过XPath选择元素的标准JavaScript方法。$X()它只是chrome DevTools中的一个助手。他们在文件中声称:

注意:此API仅可从控制台本身获得。不能从页面上的脚本访问命令行API。

page.evaluate()在这里被视为“页面上的脚本”。

    null

下面是在page.evaluate()中选择元素(特色文章)的示例:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://en.wikipedia.org', { waitUntil: 'networkidle2' });

    const text = await page.evaluate(() => {
        // $x() is not a JS standard -
        // this is only sugar syntax in chrome devtools
        // use document.evaluate()
        const featureArticle = document
            .evaluate(
                '//*[@id="mp-tfa"]',
                document,
                null,
                XPathResult.FIRST_ORDERED_NODE_TYPE,
                null
            )
            .singleNodeValue;

        return featureArticle.textContent;
    });

    console.log(text);
    await browser.close();
})();

此示例实现了与1中相同的结果。示例:

const puppeteer = require('puppeteer');

(async () => {
    const browser = await puppeteer.launch();
    const page = await browser.newPage();
    await page.goto('https://en.wikipedia.org', { waitUntil: 'networkidle2' });

    // await page.$x() returns array of ElementHandle
    // we are only interested in the first element
    const featureArticle = (await page.$x('//*[@id="mp-tfa"]'))[0];
    // the same as:
    // const featureArticle = await page.$('#mp-tfa');

    const text = await page.evaluate(el => {
        // do what you want with featureArticle in page.evaluate
        return el.textContent;
    }, featureArticle);

    console.log(text);
    await browser.close();
})();

下面是一个相关的问题,如何将$x()帮助器函数注入到脚本中。

 类似资料:
  • 问题内容: 我有这个HTML代码: 而且我必须选择带有text 的标签所标识的WebElement 。我尝试一些解决方案,例如: 但是每个人都给我: 正确的语法是什么?有人能帮我吗? 问题答案: 您没有正确的XPath语法。您需要在要匹配的文本属性值周围加上引号。尝试:

  • 问题内容: 假设我有一个名为“ xml”的表,该表将XML文件存储在单列“数据”中。如何编写运行XPath并仅返回与该XPath匹配的行的MySQL查询? 问题答案: 但是,您应该注意,MySQL对XPath的支持存在局限性。 仅返回CDATA。 并非所有XPath构造都受支持。abatishchev的答案中提到的文档页面上“ XPath限制”标题下的详细信息。

  • 我想选择所有@number has category=“a”我尝试使用//@number[@category/text()='a'],但它似乎不起作用,所以我如何获得它

  • 问题内容: 我想使用Android Studio使用Gradle构建工具开发应用程序。我无法在上插入存储库和库。我的文件如下: 如何在项目中添加OpenCV? 问题答案: 您可以在Android Studio中轻松完成此操作。 请按照以下步骤将Open CV作为库添加到您的项目中。 libraries在项目主目录下创建一个文件夹。例如,如果您的项目是OpenCVExamples,则将创建一个Ope

  • 我想使用Android Studio开发一个应用程序使用Gradle构建工具。我无法在上插入OpenCV repo和库。我的文件如下所示: 我如何在我的项目中添加OpenCV?

  • 我跟踪了元素的XPath,并希望使用selenium中的verifyText()命令提取文本。 完整XPATH:html/body/table[2]/tbody/tr/td[3]/table/tbody/tr[4]/td/table/tbody/tr[2]/td/table/tbody/tr[2]/td html的一部分如下所示,如何获取文本,即“当您在selenium中使用verifyText(

  • 问题内容: 我想对英语句子加标签,并进行一些处理。我想使用openNLP。我已经安装了 当我执行命令时 它提供输出POSTagging Text.txt中的输入 我希望它安装正确吗? 现在如何从Java应用程序内部进行此POStagging?我已将openNLPtools,jwnl,maxent jar添加到项目中,但是如何调用POStagging? 问题答案: 这是我放在一起的一些(旧)示例代码

  • 问题内容: 我必须在GWT入口点使用java.util.Calendar,但是在运行应用程序时出现错误,这是因为GWT无法找到源代码,无论如何我都可以解决此问题。 提前致谢!!! 问题答案: java.util.Calendar不是模拟的类。您可以在此处找到仿真类的列表: http://code.google.com/webtoolkit/doc/latest/RefJreEmulation.ht