Как получить доступ к части встроенного JS? - PullRequest
0 голосов
/ 16 сентября 2018

Я пытаюсь очистить какой-то веб-сайт с помощью Cheerio, однако, поскольку приложение является динамическим, содержимое отсутствует в HTML, но в объекте JS, к которому я не уверен, как получить доступ (я пробовал окно, документ и т. Д.)

Мой код:

let axios = require('axios') // HTTP client
let cheerio = require('cheerio') // HTML parsing package

const url = 'https://www.foo.com'

const getWebsiteContent = async (url) => {
    try {
        const response = await axios.get(url)
        const $ = cheerio.load(response.data)
        console.log(response.data)
    } catch (error) {
        console.error(error)
    }
}

getWebsiteContent(url)

Результат console.log (я просто вставляю ту его часть, к которой мне нужен доступ):

<!DOCTYPE html>
<html lang='en' ng-app='Test'>
<head>
</head>
<body class='' data-allow-utf8='false'>
<h1>HEADER</h1>
<script>
  var matchData = function () {
    Live.load.main({
      version:           "1.2",
      sports:            [
          {
              title: 'matchone',
              subtitle: 'foo'
          },
          {
              title: 'matchtwo',
              subtitle: 'aaa'
          }
      ],
    })
}


</script>
<!-- More stuff -->
</body>
</html>

Данные, к которым я хочу получить доступ, - это массив sports, содержащийся в этом методе Live.load.main внутри функции matchData.

Я даже не уверен, является ли Cheerio правильным инструментом, так как я ожидал, что данные будут в куске HTML, но, очевидно, загружен таким образом, что я могу видеть его только в объекте JS при запускеПОЛУЧИТЬ запрос.

1 Ответ

0 голосов
/ 16 сентября 2018

Сначала получите содержимое тега скрипта с помощью $('script').text().Возможно, вам придется настроить селектор, если на странице есть больше тегов скрипта.Затем сопоставьте массив, к которому вы хотите получить доступ, с регулярным выражением:

const script = $('script').text();
const [, arrStr] = script.match(/sports:\s+(\[[\s\S]+\])/);

Наконец, используйте команду eval, чтобы превратить строку в массив:

const arr = eval(arrStr);

См. demo .

...