Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/379.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 循环遍历木偶演员元素数组,并进一步解析每个元素_Javascript_Puppeteer - Fatal编程技术网

Javascript 循环遍历木偶演员元素数组,并进一步解析每个元素

Javascript 循环遍历木偶演员元素数组,并进一步解析每个元素,javascript,puppeteer,Javascript,Puppeteer,哦,老兄,我一直在努力解决这个问题,我太困了 我需要遍历一系列DOM对象,并使用XPath选择器从每个对象中提取信息。我的源HTML在其元素上没有任何标识ID或类,因此需要大量的遍历 下面是一些(非常简化的)示例代码。目标是获取LI元素的列表,然后在每个元素上使用更多选择器来提取跨度内的名称 简化示例代码:() const html='1〕 乔 上下快速移动 '; const browser=wait puppeter.launch(); const page=wait browser

哦,老兄,我一直在努力解决这个问题,我太困了

我需要遍历一系列DOM对象,并使用XPath选择器从每个对象中提取信息。我的源HTML在其元素上没有任何标识ID或类,因此需要大量的遍历

下面是一些(非常简化的)示例代码。目标是获取LI元素的列表,然后在每个元素上使用更多选择器来提取跨度内的名称

简化示例代码:()

const html='1〕
  • 上下快速移动
'; const browser=wait puppeter.launch(); const page=wait browser.newPage(); wait page.goto(`data:text/html,${html}`); //现在等待一秒钟,以便填充列表 让arrayOfNames=等待页面。评估(异步(页面)=>{ 让结果=[]; 让ulElements=wait page.$x('//ul'); //奇怪的是,我在这里得到一个对象,但我不应该得到一个数组吗? log('get list of UL elements:',uleelements); //使用上面的选择器遍历我们找到的每个项目 ulements.forEach(异步(项)=>{ 让oneItem=wait item.$x('//li/div'); name=oneItem.$eval('span',element=>element.innerText); log('We-found'+name); 结果:推送(姓名); } ); 返回结果; },第页); //如果成功,arrayOfNames=['Joe','Bob']
(是的,我知道使用这个示例HTML可以更轻松地完成任务。但是我正在解析的真正HTML非常复杂。这只是对我的问题的一个简化的了解。)


上面的代码失败了,说我有某种循环DOM引用。我不明白为什么。。。我一直在谷歌上搜索。。。我甚至不知道为什么以及如何在一个地方使用evaluate(),在另一个地方使用eval,然后我还阅读了evaluateHandler。。。这太令人困惑了。

我不认为您可以在
页面中使用Puppeter API。evaluate()
:它在纯浏览器上下文中执行其函数参数代码,因此尝试在此处仅使用Web API。以下是实现目标的两种等效方法(使用选择器和XPath):

“严格使用”;
常量html=`
  • 上下快速移动
`; const puppeter=require('puppeter'); (异步函数main(){ 试一试{ const browser=wait puppeter.launch(); const[page]=wait browser.pages(); wait page.goto(`data:text/html,${html}`); const arrayOfNames=等待页面。评估(()=>{ const results1=Array.from( document.queryselectoral('ul li>div span'), span=>span.innerText, ); 常量结果2=[]; const xpathList=document.evaluate( “//ul//li/div//span”, document.body,null,XPathResult.ORDERED\u NODE\u SNAPSHOT\u TYPE,null, ); for(设i=0;i
和两个相等的结果:

[ [ 'Joe', 'Bob' ], [ 'Joe', 'Bob' ] ]

我不认为您可以在
page.evaluate()中使用Puppeter API:它在纯浏览器上下文中执行其函数参数代码,因此尝试在此处仅使用Web API。以下是实现目标的两种等效方法(使用选择器和XPath):

“严格使用”;
常量html=`
  • 上下快速移动
`; const puppeter=require('puppeter'); (异步函数main(){ 试一试{ const browser=wait puppeter.launch(); const[page]=wait browser.pages(); wait page.goto(`data:text/html,${html}`); const arrayOfNames=等待页面。评估(()=>{ const results1=Array.from( document.queryselectoral('ul li>div span'), span=>span.innerText, ); 常量结果2=[]; const xpathList=document.evaluate( “//ul//li/div//span”, document.body,null,XPathResult.ORDERED\u NODE\u SNAPSHOT\u TYPE,null, ); for(设i=0;i
和两个相等的结果:

[ [ 'Joe', 'Bob' ], [ 'Joe', 'Bob' ] ]