Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/409.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 如何使用木偶师从iframe标记中刮取日期_Javascript_Puppeteer - Fatal编程技术网

Javascript 如何使用木偶师从iframe标记中刮取日期

Javascript 如何使用木偶师从iframe标记中刮取日期,javascript,puppeteer,Javascript,Puppeteer,我试图从iframe/frame标签中获取一些数据,但是我被木偶师的代码卡住了。我是一个新手,所以请容忍我。这是网站的链接。在那里,当我在第一帧中单击一个名称时,我在第二帧中获得一些数据,我可以再次单击并在第三帧中获取数据。 在代码中,我尝试循环第一帧为真,以获得第二帧和第三帧的所有数据 谢谢你的提示 我已运行此命令: document.querySelector(“正文>表格>字体>选择>选项”) 在控制台中,但我找不到在木偶戏中运行它的方法 const puppeteer = require

我试图从iframe/frame标签中获取一些数据,但是我被木偶师的代码卡住了。我是一个新手,所以请容忍我。这是网站的链接。在那里,当我在第一帧中单击一个名称时,我在第二帧中获得一些数据,我可以再次单击并在第三帧中获取数据。 在代码中,我尝试循环第一帧为真,以获得第二帧和第三帧的所有数据

谢谢你的提示

我已运行此命令: document.querySelector(“正文>表格>字体>选择>选项”) 在控制台中,但我找不到在木偶戏中运行它的方法

const puppeteer = require("puppeteer");

(async () => {

    const browser = await puppeteer.launch();

    const page = await browser.newPage();
    await page.goto('');

    const iframeParagraph = await page.evaluate(() => {

        const iframe = document.getElementsByName("stanga");

        // grab iframe's document object
        const iframeDoc = iframe.contentDocument || iframe.contentWindow.document;

        const iframeP = iframeDoc.getElementsByName("fmtstatii");

        return iframeP.innerHTML;
    });

    console.log(iframeParagraph); 

    await browser.close();

})();

这是我得到的错误:

[(node:13308) UnhandledPromiseRejectionWarning: Error: Evaluation failed: DOMException: Failed to execute 'querySelector' on 'Document': 'document.querySelector("body > form > font > select")' is not a
valid selector.
    at __puppeteer_evaluation_script__:1:33
    at ExecutionContext._evaluateInternal (D:\Zero\ratt_scrap\node_modules\puppeteer\lib\ExecutionContext.js:122:13)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  -- ASYNC --
    at ExecutionContext.<anonymous> (D:\Zero\ratt_scrap\node_modules\puppeteer\lib\helper.js:111:15)
    at ElementHandle.$ (D:\Zero\ratt_scrap\node_modules\puppeteer\lib\JSHandle.js:395:50)
    at ElementHandle.<anonymous> (D:\Zero\ratt_scrap\node_modules\puppeteer\lib\helper.js:112:23)
    at DOMWorld.$ (D:\Zero\ratt_scrap\node_modules\puppeteer\lib\DOMWorld.js:121:34)
    at process._tickCallback (internal/process/next_tick.js:68:7)
  -- ASYNC --
    at Frame.<anonymous> (D:\Zero\ratt_scrap\node_modules\puppeteer\lib\helper.js:111:15)
    at Page.click (D:\Zero\ratt_scrap\node_modules\puppeteer\lib\Page.js:986:29)
    at scrape (D:\Zero\ratt_scrap\scrape.js:23:16)
    at process._tickCallback (internal/process/next_tick.js:68:7)
(node:13308) UnhandledPromiseRejectionWarning: Unhandled promise rejection. This error originated either by throwing inside of an async function without a catch block, or by rejecting a promise which was not handled with .catch(). (rejection id: 1)
(node:13308) \[DEP0018\] DeprecationWarning: Unhandled promise rejections are deprecated. In the future, promise rejections that are not handled will terminate the Node.js process with a non-zero exit code.]
[(节点:13308)未处理PromisejectionWarning:错误:评估失败:DomeException:未能对“文档”执行“querySelector”:“文档”。querySelector(“正文>表单>字体>选择”)”不是
有效选择器。
在(木偶演员)(评估)(剧本):1:33
在ExecutionContext.\u evaluateInternal(D:\Zero\ratt\u scrap\node\u modules\puppeter\lib\ExecutionContext.js:122:13)
在进程中。_tick回调(内部/process/next_tick.js:68:7)
--异步的--
在ExecutionContext。(D:\Zero\ratt\u scrap\node\u modules\puppeter\lib\helper.js:111:15)
位于ElementHandle.$(D:\Zero\ratt\u scrap\node\u modules\puppeter\lib\JSHandle.js:395:50)
位于ElementHandle。(D:\Zero\ratt\u scrap\node\u modules\puppeter\lib\helper.js:112:23)
在DOMWorld.$(D:\Zero\ratt\u scrap\node\u modules\puppeter\lib\DOMWorld.js:121:34)
在进程中。_tick回调(内部/process/next_tick.js:68:7)
--异步的--
帧处。(D:\Zero\ratt\u scrap\node\u modules\puppeter\lib\helper.js:111:15)
在Page.click(D:\Zero\ratt\u scrap\node\u modules\puppeter\lib\Page.js:986:29)
刮削时(D:\Zero\ratt\u scrap\scrap.js:23:16)
在进程中。_tick回调(内部/process/next_tick.js:68:7)
(节点:13308)UnhandledPromisejectionWarning:未经处理的承诺拒绝。此错误源于在没有catch块的异步函数内部抛出,或拒绝未使用.catch()处理的承诺。(拒绝id:1)
(节点:13308)\[DEP0018\]弃用警告:未处理的承诺拒绝已弃用。将来,未处理的承诺拒绝将使用非零退出代码终止node.js进程。]

您犯了几个错误:

  • 您应该与
    框架
    交互,而不是与
    页面
    对象交互

    const frame = await page.frames().find(frame => frame.name() === 'stanga'); // Find the right frame.
    
  • click()
    方法需要
    选择器,因此不需要在
    click()
    方法中添加
    文档。querySelector

    await frame.click('body > form > font > select');
    
  • 要获得所有
    innerText
    ,必须迭代元素

  • 不要忘记添加
    wait
    。您错过了
    close
    方法

    await browser.close();
    
  • 解决方案:

    const puppeteer = require('puppeteer');
    
    let scrape = async () => {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();
    
    await page.goto('http://ratt.ro/txt');
    const frame = await page.frames().find(frame => frame.name() === 'stanga');
    await frame.click('body > form > font > select');
    await page.waitFor(1000);
    
    
    const optionsResult = await frame.$$eval('body > form > font > select > option', (options) => {
        const result = options.map(option => option.innerText);
    
        return result;
    });
    
    await browser.close();
    
    return optionsResult;
    };
    
    scrape().then((value) => {
      console.log(value); // Success!
    });
    

    非常感谢你!我已经为这个问题寻找了好几天的解决方案。你能给我推荐一些链接、书籍或教程来更好地理解如何更好地使用JavaScript、Node和Puppeter吗?嗨@Shiva200178!如果你把这个答案也标记为有用,那就太好了。我强烈建议阅读节点和木偶演员的官方文档。下面是关于javascript的最好的在线书籍。希望它能帮助你!嗨,叶文。我标记为有用,但我仍然被卡住了,因为这段代码选择了第一帧中的所有数据。我想要的是第一帧中的每个条目进入第二帧,然后进入第三帧,然后获取所有数据(第1帧+第2帧+第3帧).我想从第3帧输出第2帧>第1帧的所有选项的所有数据。嘿@Shiva200178!很抱歉反应太晚,我已经修正了你问题中的脚本。希望它能帮助你。嗨,Yeven。这很好,不着急,因为我才刚刚开始,我已经开始学习React和Node,我想制作一个应用程序来实时显示我项目的数据,所以不着急。现在我会等待将其保存到文件或将其作为API发布到网站上,从那里访问它,从那里开始构建我的应用程序。
    const puppeteer = require('puppeteer');
    
    let scrape = async () => {
    const browser = await puppeteer.launch({headless: false});
    const page = await browser.newPage();
    
    await page.goto('http://ratt.ro/txt');
    const frame = await page.frames().find(frame => frame.name() === 'stanga');
    await frame.click('body > form > font > select');
    await page.waitFor(1000);
    
    
    const optionsResult = await frame.$$eval('body > form > font > select > option', (options) => {
        const result = options.map(option => option.innerText);
    
        return result;
    });
    
    await browser.close();
    
    return optionsResult;
    };
    
    scrape().then((value) => {
      console.log(value); // Success!
    });