Я строю скребок, который должен получать данные из нескольких смежных элементов.По существу, есть заголовки (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;
}