Записать кукловода JSON в HTML-таблицу в HTML и сохранить его без JQuery - PullRequest
1 голос
/ 20 мая 2019

Я собираю заголовки и изображения с веб-сайта в удобочитаемом формате.

Я использую fs.writeFile и варианты:

  1. сохранить как HTML (там, где он открыт локально) или,
  2. отправить его по электронной почте на nodemailer.

В любом случае мне нужна информация в табличном формате в html. Верхняя строка = название, цена, изображение (отображается, а не ссылка). Столбцы = список предметов.

Я добавил часть для преобразования JSON в html-таблицу, но она все испортила. Теперь скрипт не запускается. Ошибка - документ не определен (при формировании таблицы).

Отдельно, если есть какой-либо способ автоматически отправлять список по электронной почте ежедневно без поддержки сервера, пожалуйста, дайте мне знать.

const puppeteer = require('puppeteer');
const fs = require('fs');

/* this gets the json data, all working ok */
async function newCam() {
   const browser = await puppeteer.launch({ headless: false });
   let page = await browser.newPage();
   await page.goto('https://sg.carousell.com/search/products/?query=camera', { waitUntil: 'networkidle2' });
   let results = []; 
   let elements = await page.$$('div.U-U');
   for (let element of elements) {
      let listTitle  = await element.$eval('div.U-m', node => node.innerText.trim());
      let listImg    = await element.$eval('.U-p img', img => img.src);
      let listPrice  = await element.$eval('div.U-k :nth-child(1)', node => node.innerText.trim());
      results.push({ 
         'Title': listTitle,
         'Img':   listImg,
         'Px':    listPrice 
      });
   }
   await browser.close();
   return results;


   /* format json into table and feed into fs below */
      // get header keys
      var col = [];
      for (var i = 0; i < results.length; i++) {
         for (var key in results[i]) {
               if (col.indexOf(key) === -1) { col.push(key); }
         }
      }

      // create table 
      var table = document.createElement("table");
      var tr = table.insertRow(-1);                   // insert header row.
      for (var k = 0; k < col.length; k++) {
         var th = document.createElement("th");      // fill header
         th.innerHTML = col[k];
         tr.appendChild(th);
      }
      // add json data as rows
      for (var a = 0; a < results.length; a++) {
         tr = table.insertRow(-1);
         for (var f = 0; f < col.length; f++) {
               var tabCell = tr.insertCell(-1);
               tabCell.innerHTML = results[a][col[f]];
         }
      }

   /* save to html on local drive with fs */ 
   fs.writeFile('/data.html', table, (err) => {
      if (err) throw err;
   });
}
newCam();

1 Ответ

1 голос
/ 20 мая 2019

Почему ваш код не работает

Вы пытаетесь использовать DOM в среде Node.js.Node.js выполняет JavaScript на стороне сервера.Таким образом, нет переменных DOM (например, window или document), к которым вы можете получить доступ.Поэтому вы получаете сообщение об ошибке document is not defined.

. Для получения дополнительной информации по этой теме вы, возможно, захотите проверить вопрос «Почему у Node.js нет встроенного DOM?»

Создание таблицы

Если вы хотите создать разметку таблицы HTML, вы можете использовать конкатенацию строк и просто объединить таблицу самостоятельно или использовать что-то вроде jsdom для имитации DOM на стороне сервера.

Поскольку ваш случай кажется довольно простым, я бы выбрал первый вариант.

Вот некоторый довольно простой код для создания HTMLразметка для таблицы.Вы можете поместить его в свой код вместо кода «создать таблицу», и он будет создавать таблицу с одним столбцом для каждого значения внутри col.

function escapeHtml(str) { // for security reasons escape "<" (you could even improve this)
    return str.replace(/</g, '&lt;');
}

const htmlTable = '<table>'
    + `\n <tr>${col.map(c => '<th>' + escapeHtml(c) + '</th>')}</tr>`
    + results // generate rows, use map function to map values to trs/tds
        .map(row => ('\n <tr>' +
            col.map(c => `\n  <td>${escapeHtml(row[c])}</td>`).join('')
        + '\n</tr>')).join('')
    + '\n</table>';

fs.writeFile('/data.html', htmlTable, (err) => {
    // ...
});

Конечно, этот код довольно простпример для начала работы.

Отправка документа по почте

Вместо локального сохранения HTML-кода вы также можете напрямую отправить его по почте с помощью nodemailer.Вот пример кода, с которого можно начать, но вы можете зайти на сайт nodemailer для получения дополнительной информации.

await transporter.sendMail({
    /* ... */
    html: 'Full HTML document.... ' + htmlTable + ' ...'
});
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...