Функция Javascript, чтобы просто получить все элементы из getElementsByClassName

Прежде всего, я просмотрел кучу, казалось бы, связанных вопросов, которые не имеют прямого отношения к моей проблеме:

javascript getElementsByClassName из переменной javascript

getElementsByClassName не выбирает все мои элементы навигации

Javascript: getElementsByClassName не предоставляет все элементы

Javascript document.getElementsByClassName не возвращает все элементы

Как изменить класс для всех элементов, полученных документом .getElementsByClassName

getElementsByClassName и jquery

Если есть другой вопрос, который уже относится к моей конкретной проблеме, я прошу прощения и, пожалуйста, направьте меня туда.

Я пытаюсь извлечь данные об открытии и текущей линии со следующей страницы: https://www.sportsbookreview.com/betting-odds/ncaa-basketball/ и возвращает данные только для определенного подмножества игр. Код ниже.

convertHalfLines = stringVal => {
  let val
  let halfLine = false
  if (stringVal.substr(-1) === '\u00BD') {
    val = parseFloat(stringVal.slice(0,-1))
    halfLine = true
  } else {
    val = parseFloat(stringVal)
  }
  return halfLine ? val + (Math.sign(val) * 0.5) : val
}

let games = document.getElementsByClassName("_3A-gC")
let gameInfo = Object.keys(games).map(game => {
  let teams = games[game].getElementsByClassName("_3O1Gx")
  let currentLines = games[game].getElementsByClassName("_3h0tU")

  console.log('currentLines',currentLines)

  return {
    'homeTeam': teams[1].innerText,
    'awayTeam': teams[0].innerText,
    'homeWagerPct': parseFloat(currentLines[1].innerText),
    'awayWagerPct': parseFloat(currentLines[0].innerText),
    'homeOpeningLine': convertHalfLines(currentLines[3].getElementsByClassName('_3Nv_7')[0].innerText),
    'awayOpeningLine': convertHalfLines(currentLines[2].getElementsByClassName('_3Nv_7')[0].innerText),
    'homeCurrentLine': convertHalfLines(currentLines[5].getElementsByClassName('_3Nv_7')[0].innerText),
    'awayCurrentLine': convertHalfLines(currentLines[4].getElementsByClassName('_3Nv_7')[0].innerText),
  }
})

Код возвращает данные для определенного набора игр, что само по себе несовместимо. Иногда он возвращает данные для первых шести игр, иногда для первых восьми, иногда меньше или больше этих. Есть ли что-то, чего я не знаю о JS, чего мне не хватает, или происходит что-то еще?


person Jeff    schedule 26.11.2018    source источник
comment
Вы уверены, что эта функция вызывается при отображении страницы? Похоже, это может быть связано с динамической загрузкой js. Как и где этот код называется?   -  person mchl18    schedule 26.11.2018
comment
Я просто открываю страницу и запускаю ее в консоли.   -  person Jeff    schedule 26.11.2018
comment
Это просто усложняет отладку, но я чувствую, что из-за неопределенных значений происходит много ошибок. Я пытаюсь как-то реорганизовать это.   -  person mchl18    schedule 26.11.2018
comment
Однажды я написал очень специфический сканер для веб-сайта, используя casper, возможно, было бы неплохо сделать это с помощью фреймворка: github.com/mchl18/casperGrabsch/blob/master/grabsch.js   -  person mchl18    schedule 26.11.2018
comment
Я понимаю, что могут быть ошибки из-за неопределенных значений, но в конечном итоге происходит то, что он в конечном итоге даже не получает полный массив элементов _3Nv_7 в каждой игре. Мне интересно, возможно, это связано с тем, что на сайте открывается сокетное соединение при отображении страницы.   -  person Jeff    schedule 26.11.2018
comment
Соединение сокета действительно может быть причиной, поскольку оно сильно изменяет DOM. В качестве обходного пути вы можете попробовать сохранить HTML и запустить скрипт на этом   -  person mchl18    schedule 27.11.2018