Puppeter: Web Scraping the Table (Массив строк?) - PullRequest
0 голосов
/ 19 марта 2020

Я пытаюсь очистить данные из таблицы , указанной на этом сайте. Я могу очистить updateDate, но у меня проблема со столбцами и строками.

Таблица, которую я пытаюсь очистить, вложена в td с идентификатором col2.

Моя проблема:

Не могу показаться чтобы выяснить, как правильно запрашивать строки, чтобы я мог получить все данные чисел (каждая строка массив строк);

enter image description here

Таблица (от инспектора):

enter image description here

Мой код:

// Find Table Rows
console.log('Searching for COVID-19 Data from Orange County');

// Table Rows
let tableRows = await page.$$('#col2 > div > table > tbody > tr');
// console.log(tableRows);

// Check For Table Rows
if (tableRows.length > 0) {
  console.log('Table Rows found');

  // Update Date (Length: 10)
  if (await tableRows[2].$$('tr > td')) {
    // Assign Element (First Row)
    let updateField = String(await tableRows[2].$eval('tr > td', td => td.innerText.trim()));

    // Check If Matches
    if (updateField.match(/(as of [0-9][0-9]\/[0-9][0-9]\/[0-9][0-9][0-9][0-9])/)) {
      const updateDate = updateField.slice(51, updateField.length - 1).trim();
      console.log(`Update Date: ${updateDate}`);
    }
    else {
      throw error('Error: Update Date doesn\'t match format');
    } 
  }

  // Cases
  if (await tableRows[5].$$('tr > td')) {
    // Assign Element (First Row)
    let totalCasesField = String(await tableRows[5].$eval('tr > td', td => td.innerText.trim()));
    console.log(totalCasesField);
  }

1 Ответ

0 голосов
/ 19 марта 2020

Как то так?

const puppeteer = require('puppeteer');

(async function main() {
  try {
    const browser = await puppeteer.launch();
    const [page] = await browser.pages();

    await page.goto('https://www.ochealthinfo.com/phs/about/epidasmt/epi/dip/prevention/novel_coronavirus');

    const data = await page.evaluate(() => {
      const table = document.querySelector('#col2 > div > table + table');
      const rowsWithNumbers = [...table.rows].slice(3, 9);
      const numbers = rowsWithNumbers.map(
        row => [...row.cells].slice(1).map(cell => cell.innerText)
      );
      return numbers;
    });

    console.log(data);

    await browser.close();
  } catch (err) {
    console.error(err);
  }
})();

Результат:

[
  ['42', '26', '16', '0',  '21', '13', '8'],
  ['22', '13', '9', '0',  '10', '8', '4'],
  ['7', '6', '1', '0', '5', '2', '0'],
  ['12', '7', '5', '0',  '5', '3', '4'],
  ['1', '0', '1', '0', '1', '0', '0'],
  ['0', '0', '0', '0', '0', '0', '0']
]
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...