только царапает первый элемент. Любые предложения, почему это так?

аюсь удалить сайт со следующим кодом:

const cheerio = require('cheerio');
const jsonframe = require('jsonframe-cheerio');

const $ = cheerio.load('https://coinmarketcap.com/all/views/all/');
jsonframe($); // initializes the plugin

//exception handling 
process.on('uncaughtException', err =>
  console.error('uncaught exception: ', err))
process.on('unhandledRejection', (reason, p) =>
  console.error('unhandled rejection: ', reason, p))

const frame = {
    "crypto": {         
        "selector": "tbody > tr",   
        "data": [{             
            "name": "td:nth-child(2) > a:nth-child(3)", 
            "url": {                                  
                "selector": "td:nth-child(2) > a:nth-child(3)",    
                "attr": "href"                     
            },
            "marketcap": "tr > td:nth-child(4)",
            "price": "tr > td:nth-child(5) > a:nth-child(1)", 
        }]
    }

};

let companiesList = $('tbody').scrape(frame);
console.log(companiesList); 

Тем не менее, я получаюUnhandledPromiseRejectionWarning при запуске приведенного выше примера кода:

(node:3890) UnhandledPromiseRejectionWarning: Unhandled promise rejection (rejection id: 1): TypeError: selector.includes is not a function

Есть предложения, что я делаю не так?

Я ценю ваши ответы!

ОБНОВИТЬ

Я изменил свой код на следующий ниже. Тем не менее, я могу отказаться только от первого элемента.

Любые предложения, почему другие элементы не выбрасываются?

const cheerio = require('cheerio')
const jsonframe = require('jsonframe-cheerio')
const got = require('got');


async function scrapCoinmarketCap() {
    const url = 'https://coinmarketcap.com/all/views/all/'
    const html = await got(url)
    const $ = cheerio.load(html.body)

    jsonframe($) // initializing the plugin

    let frame = {
        "Coin": "td.no-wrap.currency-name > a",
        "url": "td.no-wrap.currency-name > a @ href",
        "Symbol": "td.text-left.col-symbol",
        "Price": "td:nth-child(5) > a",
    }

    console.log($('body').scrape(frame, {
        string: true
    }))
}

scrapCoinmarketCap()
 Boaz26 окт. 2017 г., 09:07
Какая версияjsonframe-cheerio ты используешь? Судя по синтаксису в вашем фрагменте, я подозреваю, что вы полагаетесь на документацию или пример версии 1.x. В последней версии 2.x внесено множество изменений. Файл readme содержит это предупреждение:«Осторожно, если вы использовали jsonframe из версии 1.x.x, некоторые вещи изменились, чтобы сделать его более гибким, более быстрым в использовании (встроенные параметры) и более значимым в синтаксисе».
 Anna.Klee27 окт. 2017 г., 08:08
@Boaz я использую"cheerio": "^1.0.0-rc.2" а также"jsonframe-cheerio": ^3.0.1"
 Anna.Klee27 окт. 2017 г., 08:06
@FelixKling Я используюnode --version v8.4.0
 Felix Kling26 окт. 2017 г., 08:36
Какую версию узла вы используете?

Ответы на вопрос(2)

вы можете очистить все данные о валюте, повторяя каждыйtr:

$('body tr').each(function() {
  console.log($(this).scrape(frame, {
    string: true
  }))
})

Тем не менее, я думаю, что самый чистый способ сделать это (как я уже говорил веще один ответ) это использоватьjsonframe-здор`ово Список / Массив шаблон кадра, который точно предназначен для этого:

let frame = {
  currency: {
    _s: "tr",  // the selector
    _d: [{  // allow you to get an array of data, not just the first item
      "Coin": "td.no-wrap.currency-name > a",
      "Url": "td.no-wrap.currency-name > a @ href",
      "Symbol": "td.text-left.col-symbol",
      "Price": "td:nth-child(5) > a"
    }]
  }
}

console.log($('body').scrape(frame, {
  string: true
}))
 Anna.Klee31 окт. 2017 г., 08:22
Спасибо за ваш ответ! Еще один вопрос, что бы вы порекомендовали, если я хочу удалить также подстраницу из извлеченного URL? Нужно ли мне запустить это черезfor-loop или есть лучший способ вjsonframe плагин?
 TGrif31 окт. 2017 г., 10:09
Не уверен, но я не думаю, что существует возможность сделать это. Возможно, вам придется создать свою собственную рекурсивную функцию.

cheerio.load() не принимает URL -он требует HTML в виде строки.

Хотя я не изучал исходный код cheerio, может показаться, что модуль пытается проанализировать URL-адрес как HTML-документ, который, очевидно, дает сбой и начинают появляться различные ошибки.

Чтобы решить эту проблему, необходимо сначала загрузить HTML-содержимое этого URL-адреса в переменную, а затем передать это HTML-содержимое в cheerio.

Вы можете сделать это с помощью таких модулей, какrequest или жеgot.

Вот пример загрузки страницы с помощьюgot:

const got = require('got')
const cheerio = require('cheerio')

got('https://google.com')
.then(res => {
  const $ = cheerio.load(res.body)
  // Continue as usual
})
.catch(console.error)
 Anna.Klee27 окт. 2017 г., 08:09
Спасибо за ваш ответ! Я любезно спрашиваю вас, может ли ваш минимальный жизнеспособный пример показать отказ от ссылки на пример в моем вопросе.
 Anna.Klee29 окт. 2017 г., 09:05
Я попробовал ваш код, и я все еще получаю ту же ошибку, как показано выше!
 Robert Rossmann27 окт. 2017 г., 09:27
Я совершенно уверен, что вы можете скопировать / вставить свой исходный код очистки в// continue as usualкомментируемый блок. Вы неправильно использовали cheerio - просто попробуйте правильно, и я уверен, что вы сами разберетесь!
 Anna.Klee30 окт. 2017 г., 10:46
Просто исправил приведенный выше код. Тем не мение,cheerio только царапает первый элемент. Любые предложения, почему это так?

Ваш ответ на вопрос