Используя библиотеку Node JS got(), как вы выбираете элементы, отличные от тела?

#javascript #html #css #node.js

#javascript #HTML #css #node.js

Вопрос:

Я пробовал несколько разных вещей, и результат каждого из них не определен. Мои попытки приведены ниже:

 function readHTTP(sm){
    const file = '/Users/codel/OneDrive/Documents/BattlEye/files/temp.txt'
    const url= 'https://r6.tracker.network/profile/pc/'   sm[1];
    (async () => {
        try {
            const page = await got(url);
            console.log(page.div);
            console.log(page.body.class);
            console.log(page.body.div);
            console.log(page.class);
            console.log(page.class);
            console.log(page.class);
            console.log(page.class);
            let content = page.body;
            fs.writeFile(file, content, err => {
                if (err) {
                  console.error(err)
                  return
                }
            });
        } catch (error){
            console.log(error.page.class);
        }
    })();
}
 

Единственная причина, по которой мне нужно выбрать определенный элемент, заключается в том, что мне не нужно записывать ответ во временный файл, а затем анализировать его оттуда. это кажется неэффективным, особенно если есть способ выбрать определенный элемент, такой как:

 <div class="trn-defstat__name">Level</div>
<span class="trn-text--dimmed">Ranked</span>
<div data-stat="PVPKDRatio" class="trn-defstat__value">
<div data-stat="PVPWLRatio" class="trn-defstat__value">
<div data-stat="RankedKDRatio" class="trn-defstat__value">
<div data-stat="RankedWLRatio" class="trn-defstat__value">
 

Эти элементы находятся внутри тела, но я просто не знаю, как индивидуально выбирать элементы. Может кто-нибудь объяснить, есть ли способ сделать это или определить наиболее эффективный способ сделать это?

Редактировать: использование cheerio в этом контексте приводило к ошибкам всякий раз, когда я пытался подключиться к URL. Я, скорее всего, использую неправильный стиль в этом контексте, но вот мой код:

 function readHTTP(sm){
    console.log('level');
    console.log('levelText');
    var url= 'https://r6.tracker.network/profile/pc/'   sm[1];
    request(url,function(err,resp,body){
        if(!error){
            var $ = cheerio.load(body);
            var level = $('.trn-defstat__value');
            var levelText = level.text();
            console.log(level);
            console.log(levelText);
        }
    })
}
 

который выдает ошибку:

 events.js:292
      throw er; // Unhandled 'error' event
      ^

Error: socket hang up
    at connResetException (internal/errors.js:617:14)
    at TLSSocket.socketOnEnd (_http_client.js:493:23)
    at TLSSocket.emit (events.js:327:22)
    at endReadableNT (_stream_readable.js:1327:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21)
Emitted 'error' event on ClientRequest instance at:
    at TLSSocket.socketOnEnd (_http_client.js:493:9)
    at TLSSocket.emit (events.js:327:22)
    at endReadableNT (_stream_readable.js:1327:12)
    at processTicksAndRejections (internal/process/task_queues.js:80:21) {
  code: 'ECONNRESET'
}
 

После небольшого изучения cheerio я нашел альтернативу — puppeteer, который ожидает загрузки страницы, чтобы запросить ответ. Вот мое использование этой библиотеки:

 function readHTTP(sm){
     const puppeteer = require('puppeteer');
     var url= 'https://r6.tracker.network/profile/pc/'   sm[1];
     (async() => {
        const browser = await puppeteer.launch();
        const page = await browser.newPage();
        await page.goto(url);
        const data = await page.evaluate(() => {
            return Array.from(document.querySelectorAll('.trn-defstat__value'))
                    .map(item => item.innerText);
        }); 
        writeStatFile(m,cc,sm,data)
    })();
}
 

Он работает довольно хорошо и получает все данные, которые мне нужно извлечь из HTML-кода. Но мой вопрос все еще остается в силе, есть ли более быстрый и эффективный способ сделать это?

Мой текущий метод занимает около 3/2 секунд, чтобы вернуть все данные в консоль.

Комментарии:

1. Я полагаю, вам нужно использовать что-то вроде cheerio вместо got

2. @Anatoly Я пытаюсь поддержать, но, похоже, я выдаю ошибку: «зависание сокета» и «событие ошибки в экземпляре ClientRequest at». Будет ли cheerio наиболее эффективным способом сделать это, вот мой вопрос.

3. Используя cheerio, вам не нужно разбирать HTML вручную, вот что я пытаюсь сказать