#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 вручную, вот что я пытаюсь сказать