http ПОЛУЧИТЬ возврат ПОЛНОСТЬЮ РАЗЛИЧНЫХ HTML-элементов и innerHTML из того, что видно в DOM-элементах браузера - PullRequest
0 голосов
/ 28 февраля 2019

Цель:
Чтобы экспортировать всю HTML-страницу (из этого определенного URL-адреса) в 'newFileOnLocalDisk.txt' для автономного изучения данных.

Обнаружена проблема:
Способенэкспортировать HTML-код этого конкретного URL-адреса в 'newFileOnLocalDisk.txt' ... НО ... экспортированные HTML-элементы и значения НЕ совпадают с данными в DOM браузера.

const http = require('http');
const url = 'http://www.bursamalaysia.com/market/securities/equities/prices/#/?filter=BS02&page=3';

const httpGet = url => {
    return new Promise((resolve, reject) => {
      http.get(url, res => {
        res.setEncoding('utf8');
        let body = ''; 
        res.on('data', chunk => body += chunk);
        res.on('end', () => resolve(body));
      }).on('error', reject);
    });
};

async function exportToLocalHTMLfile () {
    const body = await httpGet(url);
        /*********************************************************
        * What's returned to console.log is totally different
        * from what is in browser's DOM Elements / inspect element
        * 
        * Question #1:
        * How can we export "as-is or in raw HTML" directly from  
        * less-friendly pages like this?
        * 
        *********************************************************/
        console.log(body); //<-- will be later exported to TEXT file. Codes removed to keep this article leaner.
    }

    exportToLocalHTMLfile();

console.log(body) вернул приведенную ниже выдержку.Это полностью отличается от того, что находится в элементе DOM браузера

<html><head>
<meta http-equiv="Pragma" content="no-cache"/>
<meta http-equiv="Expires" content="-1"/>
<meta http-equiv="CacheControl" content="no-cache"/>
<noscript>Please enable JavaScript to view the page content.</noscript>

<APM_DO_NOT_TOUCH>
<script language="javascript">
//<![CDATA[

(function(){
    var securemsg;
    var packmsg;
    var CryptoUtils;

try{(function(){try{var _S,IS,lS=1,LS=1,ZS=1,__=1,i_=1,I_=1,j_=1;for(var J_=0;J_<IS;++J_)lS+=2,LS+=2,ZS+=2,__+=2,i_+=2,I_+=2,j_+=3;_S=lS+LS+ZS+__+i_+I_+j_;window.JS===_S&&(window.JS=++_S)}catch(l_){window.JS=_S}var L_=window.sdkljshr489=!0;function o_(S){window.sdkljshr489&&S&&(L_=!1);return L_}function O_(){}o_(window[O_.name]===O_);o_("undefined"===window.vodsS0);window.vodsS0=null;o_(/\x3c/.test(function(){return"\x3c"})&/x3d/.test(function(){return"0";"x3d"}));
var Z_=window.attachEvent||/mobi/i.test(navigator.userAgent),_ .... (end of excerpt)

Для вашей информации, нечитаемое содержимое в 'newFileOnLocalDisk.txt' имеет длину 61 055 символов.Ни один из них не напоминал никаких данных внутри id="bm_price_container"

Если есть лучшие методы или стратегии для решения этой задачи, чем const http = require('http');, укажите, пожалуйста, путь?Заранее благодарим за ваше время и усилия в сияющем свете.

1 Ответ

0 голосов
/ 01 марта 2019

Вам нужен модуль Node.js, который загружал бы страницу в браузер без заголовка, чтобы выполнить весь код JavaScript на странице и динамически обновить DOM.Например, вы можете попробовать GoogleChrome / puppeteer .

'use strict';

const puppeteer = require('puppeteer');

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

    await page.goto(
      'http://www.bursamalaysia.com/market/securities/equities/prices/#/?filter=BS02&page=3',
      { waitUntil: 'networkidle0' },
    );
    await page.waitFor(5000);

    const html = await page.content();
    console.log(html);

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