如何在JavaScript代码中获取JavaScript对象? TL;博士

如何在JavaScript代码中获取JavaScript对象? TL;博士,javascript,node.js,web-crawler,puppeteer,Javascript,Node.js,Web Crawler,Puppeteer,我想要像下面的代码一样解析JSON的parseParameter。 someCrawledJSCode是已爬网的JavaScript代码 const data=parseParameter(someCrawledJSCode); console.log(数据);//数据1:{…} 问题 我正在用Puppeter爬行一些JavaScript代码,我想从中提取一个JSON对象,但我不知道如何解析给定的JavaScript代码 已爬网的JavaScript代码示例: const somecode =

我想要像下面的代码一样解析JSON的
parseParameter
someCrawledJSCode
是已爬网的JavaScript代码

const data=parseParameter(someCrawledJSCode);
console.log(数据);//数据1:{…}
问题 我正在用Puppeter爬行一些JavaScript代码,我想从中提取一个JSON对象,但我不知道如何解析给定的JavaScript代码

已爬网的JavaScript代码示例:

const somecode = 'somevalue';
arr.push({
  data1: {
    prices: [{
      prop1: 'hi',
      prop2: 'hello',
    },
    {
      prop1: 'foo',
      prop2: 'bar',
    }]
  }
});
在这段代码中,我想获得
prices
array(或
data1

我所做的
我尝试将代码解析为JSON,但它不起作用。所以我搜索了解析工具,找到了。但我认为这对解决这个问题没有帮助。

刮擦会很难看。通过对您试图解析的字符串进行一些假设,您可以:

  • 提取推送到阵列的零件
  • 将该字符串转换为有效的JSON:

    • 将字符串文字的分隔单引号替换为双引号
    • 将不带引号的属性名称用双引号括起来
    • 删除最后一个属性后面的逗号
  • 要可靠地做到这一点,您必须编写一个与JSON解析器一样复杂的解析器,但根据一些假设,它可能可以简化为:

    //示例数据
    变量someCrawledJSCode=`
    const somecode='somevalue';
    arr.push({
    数据1:{
    价格:[{
    prop1:‘嗨’,
    prop2:'你好',
    },
    {
    prop1:‘foo’,
    建议二:"酒吧",,
    }]
    }
    });`;
    var-obj;
    var notJson=someCrawledJSCode.replace(/\.push\([^]*?)\)/,([^,notJson)=>{
    //尝试将字符串转换为有效的JSON:
    //1.字符串文字不应包含在单引号中,而应包含在双引号中
    //2.属性名称应包含在双引号中
    //3.最后一个属性后不应有尾随逗号
    var json=notJson.replace(/'(\\.\\.[^\\']])*)/g,“$1”)
    .替换(/(\w+):g,“$1”:”
    .replace(/,\s*}/g,“}”);
    obj=JSON.parse(JSON);
    });
    控制台日志(obj)简短回答:不要(重新)在Node.js中构建解析器,而是使用浏览器
    我强烈建议不要在Node.js中评估或解析已爬网的数据,如果您使用Puppeter进行爬网。当您使用Puppeter时,您已经有了一个浏览器,其中包含一个用于在另一个进程中运行JavaScript代码的强大沙箱。为什么要冒这种隔离风险,在Node.js脚本中“重建”解析器?如果Node.js脚本中断,整个脚本将失败。在最坏的情况下,当您试图在主线程中运行不受信任的代码时,您甚至可能会使您的计算机面临严重的风险

    相反,尝试在页面上下文中进行尽可能多的解析。你甚至可以在那里进行邪恶的评估。有可能发生最坏的情况吗?您的浏览器挂起或崩溃

    例子 想象一下下面的HTML页面(非常简化)。您正在尝试读取推入数组的文本。您仅有的信息是,还有一个附加属性
    id
    ,该属性设置为
    目标数据

    
    var-arr=[];
    //一些复杂的代码。。。
    arr.push({
    id:'不感兴趣的数据',
    data:'一些不想爬网的数据',
    });
    //这里有更复杂的代码。。。
    arr.push({
    id:'目标数据',
    
    data:“这是您想要爬网的数据”,我认为使用AST生成器(如Esprima)或其他AST工具是读取和处理源代码的最简单方法

    老实说,如果您知道如何运行Esprima并生成“抽象语法树”从源代码中,您会发现读取生成的树结构(表示刚刚解析的代码)非常容易,并且您会发现读取信息并将其转换为所需内容非常容易

    一开始可能会让人望而生畏,但老实说,事实并非如此。你会感到惊讶:像Esprima这样的AST工具完全是为了达到与你所尝试的目的相似的目的,从而使工作变得简单

    AST工具诞生于多年来对如何读取和操作源代码的研究,因此我强烈推荐它们

    试试看

    为了帮助您了解各种AST的外观,您可以查看。了解各种工具中的AST树结构的外观非常有用


    哦,最后一件事!为了遍历AST树,您可以使用类似的方法。这将使生活变得简单。

    有一个解决方案可用,但它非常不安全,特别是因为您通过爬行从外部源获取js。您可以尝试使用
    eval
    。我考虑过
    eval
    ,但我将运行此代码在服务器端,这太危险了。所以我想得到另一个解决方案。感谢回复。修复了捕获组的问题。感谢新方法建议。我使用
    评估
    并返回
    arr
    解决了这个问题。