使用.querySelector努力查询具有相同类名的特定元素

时间:2018-10-23 08:26:09

标签: javascript node.js web-crawler google-chrome-devtools puppeteer

因此,我尝试使用Puppeteer抓取网站。我要获取的所有数据都在多个表中。具体来说,我正在尝试从单个表中获取数据。我能够使用非常冗长的.querySelector(table.myclass ~ table.myclass)来获取特定的表,所以现在我的问题是,我的代码正在获取每个表的第一项(从正确的表开始,即第二个表),但是我无法找到一种方法来仅获取第二张表中的所有数据。

const puppeteer = require('puppeteer');
const myUrl = "https://coolurl.com";

(async () => {
  const browser = await puppeteer.launch({
    headless: true
  });
  const page = (await browser.pages())[0];
  await page.setViewport({
    width: 1920,
    height: 926
  });
  await page.goto(myUrl);

  let gameData = await page.evaluate(() => {
    let games = [];
    let gamesElms = document.querySelectorAll('table.myclass ~ table.myclass');
    gamesElms.forEach((gameelement) => {
      let gameJson = {};
      try {
        gameJson.name = gameelement.querySelector('.myclass2').textContent;
      } catch (exception) {
        console.warn(exception);
      }
      games.push(gameJson);
    });
    return games;
  })
  console.log(gameData);
  browser.close();
})();

1 个答案:

答案 0 :(得分:2)

您可以使用以下两种方法之一来选择第二张表:

let gamesElms = document.querySelectorAll('table.myclass')[1];
let gamesElms = document.querySelector('table.myclass:nth-child(2)');

此外,您可以使用下面的示例将表中的所有数据推送到数组:

let games = Array.from(document.querySelectorAll('table.myclass:nth-child(2) tr'), e => {
  return Array.from(e.querySelectorAll('th, td'), e => e.textContent);
});

// console.log(games[rowNum][cellNum]); <-- textContent