JS Web Scraper зависает на оценке - PullRequest
0 голосов
/ 25 октября 2018

Я строю скребок, который должен получать данные из нескольких смежных элементов.По существу, есть заголовки (h3), которые отображают категории, рядом с которыми есть таблицы рангов.Я пытаюсь просканировать страницу на предмет наличия строки, чтобы выяснить, была ли эта строка ранжирована в категории и, если да, какого ранга она достигла (A, B или C), то заполнить массив объектами, которые описывают, чтокатегории и ранги, которых достигла строка (phew).

Первоначально я сгенерировал ошибку в цикле while ("не могу определить свойство 'tagName' of null"), так как sib продолжал вычислять доноль по какой-то причине.Я добавил тест на случай, если это произойдет в конце arr , но теперь код просто зависает на неопределенный срок.У меня такое чувство, что sib определяется не сразу, но я не могу понять, почему это так или иначе.

Я тестирую все в Chrome DevTools, если это помогает.Кроме того, я не использую функцию Fat Arrow в DevTools, чтобы проверить это, так что она сама по себе не способствует этой проблеме, но, если это в конечном итоге обернется, пожалуйста, дайте мне знать!

(str) => {
  let h = document.getElementsByTagName('h3');
  let arr = [];
  let res = [];

  for ( let i = 0; i < h.length; i++){ //Filter out any h3's that are not category headers.
    h[i].id.includes('category-') && arr.push(h[i]);
  };

  for ( let i = 0; i < arr.length; i++){
    let head = arr[i].innerText; //Save the current category header.
    let sib = arr[i].nextElementSibling; //Should be a table containing rank A.
    while ((sib != null) && (sib.tagName == 'TABLE')){
      if(sib.innerText.includes(str)){ //Create an object if the rankings table contains our target.
        let hit = {};
        hit.category = head;
        hit.rank = sib.children[0].innerText;
        res.push(hit);
      }
      else{ //Go to the next table which contains the next rank.
        sib = sib.nextElementSibling;
      };
    };
  };
return res;
}
...