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