Парсинг текста с сайта

Доброго времени суток. В общем вот в чем суть задачи: мне нужно с сайтов автошкол взять кусок текста (например, стоимость обучения) и вывести его в ячейку таблицы v-data-table (использую Vue+Vuetify).
Проблема в том, что я не знаю как можно взять оттуда именно кусок текста. Пробовал использовать cheerio, но там на некоторых сайтах нет вообще css-селекторов, к которым можно обратиться. Теперь думаю может можно как-то распарсить страницу в файл, и уже оттуда в переменную записывать нужную мне информацию. Не знаю от чего отталкиваться, подскажите пожалуйста что-нибудь.

Все верно делаешь. Даже есть у элементов нет селекторов, к ним можно обратиться по длинному селектору. Возможно ты пробуешь написать 1 парсер для всех сайтов. Так не надо делать. Решением будет написать специализированные парсеры для каждого сайта.

Например я писал недавно парсер списка праздников с сайта https://www.timeanddate.com/holidays/. И далеко не у всех элементов были классы, поэтому я писал длинные странные селекторы чтобы добраться до нужного текста. Вот такая конструкция получается:

const holidays = $('.zebra.fw.tb-cl.tb-hover tbody tr').map((index, trNode) => {
    const date = parseDate($(trNode).find('>*').eq(0).text(), FORCE_YEAR)
    const day = $(trNode).find('>*').eq(1).text()
    const holidayName = $(trNode).find('>*').eq(2).text()
    const holidayType = $(trNode).find('>*').eq(3).text()
    resultHolidays.push({
        date: date.toString(),
        holidayName,
        holidayType,
        country,
        worldPart
    })
})

Я так и собирался делать: для каждого по отдельности.
Вот так я писал чтобы вывести стоимость с одного из сайтов:
request(url, function(err, res, body){
var $=cheerio.load(body);
var stoim = $(’.su-animate > h3 > span’);
var stoimost = stoim.text();
console.log(stoimost);
})
В консоль мне выводит: 490 руб. (включая стоимость топлива). 490 руб. находится в отдельном от текста в скобках, я немного не разобрался как только один из них вывести.

А эти селекторы вы откуда брали?

Дописывай дообработку текста с помощью регулярных выражений. Я верно понял что теперь у тебя задача получить число 490 из строки 490 руб. (включая стоимость топлива).?

Посмотрел как добраться до элементов на странице. Для контекста этот код добывает значения из таблицы на такой странице https://www.timeanddate.com/holidays/afghanistan/.

Да, все верно поняли, я пытался использовать регулярки, но был мягко говоря удивлен, когда погуглил и увидел сколько там разных выражений. Я думал использовать это: /(\w+)\s(\w+)/;

  1. Посмотри какие варианты строк возможны. Сохрани в отдельный файл возможные типы строк.
  2. Подбери такую регулярку с помощью https://regexr.com и сохраненных строк, чтобы. https://regexr.com удобен визуализацией какая часть строки подходит под написанную регулярку.
  3. Заодно посмотри как будет работать на этих текстах та регулярка, которую думаешь использовать.

Предположим что во всех вариантах строк числа являются только ценой урока (и не бывает дат или еще других цифр), то извлеч цену можно с помощью такой регулярки: https://regexr.com/3irkq

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

Вы сначала обратились к селектору тега

и затем уже ниже по тегам пошли?
В таком случае как мне быть если на странице в целом селекторы используются в шапке, а весь текст состоит из абзацев и обернут в кучу
? Я сначала думал может обратиться к тому селектору и уже от него идти ниже до нужного абзаца, но проблема в том, что этот абзац представляет собой почти весь текст со страницы. Собственно из-за этого я и запутался, ибо на всех трех сайтах, что мне нужны, все абсолютно по-разному.

Не обязательно сохранять страницу в файл.

Можешь взять за основу мой код. https://github.com/podgorniy/timeanddate-scrapper

Логика следующая. С помощью пакета crawler организуешь загрузку url. crawled загружает страницу и дает объект cheerio. cheerio - это похожий API на jquery для выборки элементов. С помощью объекта cheerio получаешь доступ к элементам загруженной страницы. В этой строке const holidays = $(’.zebra.fw.tb-cl.tb-hover tbody tr’) я получил список элементов, в которых находятся нужные для меня данные. Итерирую по этим элементам и извлекаю данные. Некоторые данные предобрабатываю прежде чем складывать. Например парсю дату в этой строке const date = parseDate($(trNode).find('>*').eq(0).text(), year) . Потому что формат записи даты на сайте не такой, с которым js умеет работать.

Наверное ты хотел вставить код, не вижу его. Не поленись посмотреть как форматировать исходный код.

Писать функцию фильтрации нужного элемента с помощью доступных селекторов cheerio а так же map, filter, reduce и других функций фильтраций массивов.

Значит писать программу парсинга текста этого абзаца. Разбить текст регулярками, отфильтровать. Или попробовать написать 1 регулярку для извлечения текста.

Кажется мы это уже прошли. Выше я говорил.

Это и будет решением.

Возможно не очевидная для тебя вещь: чтобы запустить проект https://github.com/podgorniy/timeanddate-scrapper1 из папки проекта в коммандной строке запусти npm run dev. Это стартанет процесс обработки сайта + будет рестартовать процесс каждый раз когда ты меняешь исходный js код проекта.

ну про это я в курсе, благодарю. Буду изучать дальше, посмотрю ваш код, за это кстати тоже большое спасибо)

Пожалуйста

Добрый день, у меня тут вопрос возник вот я сделал таким образом:

request(url, function(err, res, body){
      var $=cheerio.load(body);
      var reg = /\d+/g;
      var stoim = $('.su-animate > h3 > span');
      var stoimost = stoim.text();
      var stoimost2 = reg.exec(stoimost);
      console.log(stoimost2);
      })

Мне в консоли выводит вот так:
[ ‘490’,
index: 0,
input: ‘490 руб. (включая стоимость топлива)\n’ ]
Это оно для консоли так выводит и в итоге, когда я буду в таблицу кидать будет нормально? Или это фишка exec такая?

exec возвращает массив. И его ты видишь в консоли. Скорее всего ты хочешь в таблицу складывать только значение. Тогда бери элемент массива по индексу.

var stoimost2 = reg.exec(stoimost)[0];

И еще. Если регулярка не нашла соответствующей подстроки, exec вернет null.
Это тоже стоит учесть в коде. Иначе reg.exec(stoimost)[0]; выкинет ошибку.

да, как раз вчера разбирался и мне выдало null, но потом вроде нормально заработало, спасибо большое еще раз