在puppteer中链接查询选择器

时间:2018-10-04 16:43:03

标签: jquery-selectors puppeteer

如何像在量角器中那样在puppteer中链接查询选择器?

return this.page.$$(".stop.departed").$$eval(".station",el=>el.innerText)

我得到TypeError: this.page.$$(...).$$eval is not a function

我的HTML是

 <div class="stop departed">
  <div class="left">
    <div class="station">London
    </div>
    <div class="scheduled">Dept. 10:47
    </div>
  </div>    
 </div>
 <div class="stop departed">
  <div class="left">
    <div class="station">Paris
    </div>
    <div class="scheduled">Dept. 12:47
    </div>
  </div>    
 </div>

我想在列表[“ London”,“ Paris”]中获得所有电台名称。

1 个答案:

答案 0 :(得分:0)

page.$$()elementHandle.$$eval()这两种方法都返回承诺,因此您必须await都使用它们。

这些函数也都在选择器上运行querySelectorAll(),因此在运行下一个操作(或遍历所有索引)之前,必须按索引指定元素。

以下示例将在第一个站点返回第一个站点:

const first_station = await ( await page.$$( '.stop.departed' ) )[0].$$eval( '.station', el => el[0].innerText );

console.log( first_station ); // London

或者,您可以使用以下示例为每个停靠站获取一个站点阵列:

const stations = await Promise.all(
    ( await page.$$( '.stop.departed' ) ).map( el => el.$$eval( '.station', el => el.map( el => el.innerText ) ) )
);

console.log( stations.length );    // 2
console.log( stations[0].length ); // 1
console.log( stations[1].length ); // 1
console.log( stations[0][0] );     // London
console.log( stations[1][0] );     // Paris

或者如果每个停靠站只有一个车站,则可以使用:

const stations = await Promise.all(
    ( await page.$$( '.stop.departed' ) ).map( el => el.$$eval( '.station', el => el[0].innerText ) )
);

console.log( stations.length ); // 2
console.log( stations[0] );     // London
console.log( stations[1] );     // Paris