如何在JavaScript代码中获取JavaScript对象? TL;博士
我想要像下面的代码一样解析JSON的如何在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 =
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,但它不起作用。所以我搜索了解析工具,找到了。但我认为这对解决这个问题没有帮助。刮擦会很难看。通过对您试图解析的字符串进行一些假设,您可以:
- 将字符串文字的分隔单引号替换为双引号李>
- 将不带引号的属性名称用双引号括起来李>
- 删除最后一个属性后面的逗号
//示例数据
变量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
解决了这个问题。