Javascript 如何访问一段嵌入式JS?

Javascript 如何访问一段嵌入式JS?,javascript,html,node.js,cheerio,Javascript,Html,Node.js,Cheerio,我正在尝试使用Cheerio抓取一些网站,但是由于该应用程序是动态的,内容不存在于HTML中,而是存在于JS对象上,我不确定如何访问该对象,我尝试了窗口、文档等 我的代码: let axios = require('axios') // HTTP client let cheerio = require('cheerio') // HTML parsing package const url = 'https://www.foo.com' const getWebsiteContent =

我正在尝试使用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数组,它包含在matchData函数中的Live.load.main方法中


我甚至不确定ChereIO是否是正确的工具,因为我希望数据以HTML的形式出现,但显然是以某种方式加载的,因此在启动GET请求时,我只能在JS对象中看到它。

首先,使用$'script'.text获取脚本标记的内容。如果页面上有更多脚本标记,则可能需要调整选择器。然后将要访问的数组与正则表达式匹配:

const script = $('script').text();
const [, arrStr] = script.match(/sports:\s+(\[[\s\S]+\])/);
最后,使用eval将字符串转换为数组:

const arr = eval(arrStr);
请参阅。

可能的副本