Как очистить таблицу с изменяющимися данными с помощью Cheerio в Node.js?

Я пытаюсь очистить данные из таблицы на веб-сайте, значения которой постоянно меняются. Таким образом, каждая строка может меняться изо дня в день, но я хочу иметь возможность очищать правильные данные. В данный момент я использую библиотеку Cheerio и не знаком с ней, но вот что у меня есть:

const rp = require("request-promise");
const cheerio = require("cheerio");

let Italy = "";

async function main() {
    const result = await rp.get("https://www.worldometers.info/coronavirus/");
    const $ = cheerio.load(result);

    $("#main_table_countries > tbody:nth-child(2) > tr:nth-child(2)").each((i,el) => {
        const item = $(el).text();
        Italy = item;
    });
}

Итак, как вы можете видеть, это данные о случаях коронавируса в Италии с веб-сайта worldometer. Однако за последние несколько дней позиция Италии менялась со 2-й на 3-ю. Это привело к тому, что моя программа получила неверную информацию. Это то, что я хотел бы исправить.

Вот ссылка на сайт worldometer: https://www.worldometers.info/coronavirus/

Спасибо, Картик


person Karthik Nandula    schedule 09.03.2020    source источник
comment
Возможно, вам вообще не нужно очищать HTML: см. мой ответ о получении текущих данных о коронавирусе из CSV, что привело к следующему: jsfiddle.net/jys01z9b   -  person blex    schedule 09.03.2020


Ответы (2)


Что я реализовал, так это то, что вы можете получить все tr's и перебрать их, чтобы получить все имена и добавить их в массив, а затем использовать индекс массива, чтобы найти любую страну, которую вы хотите.

async function main() {
    let NamesArr=[]
    let CountryToFind= 'Italy'


    const result = await rp.get("https://www.worldometers.info/coronavirus/");
    const $ = cheerio.load(result);

    $('#main_table_countries').find('tbody').eq(0).find('tr').each((i,el)=>{
        NamesArr.push($(el).find('td').eq(0).text().trim())
    })

    let Index= NamesArr.indexOf(CountryToFind) + 1 

    $(`#main_table_countries > tbody:nth-child(2) > tr:nth-child(${Index})`).each((i,el) => {
        const item = $(el).text();
        console.log(item);
    });
}

main()

Это возвращает меня

Изображение результата CMD

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

person Shivam Sood    schedule 09.03.2020

Используйте псевдоним :contains для этого:

$('tr:contains(Italy)').text()
//"  Italy  9,172   +1,797   463  +97  724    7,985  733   151.7 "
person pguardiario    schedule 10.03.2020